在跨域请求上捕获JSONP错误

Mat*_*eau 6 javascript error-handling jquery json jsonp

我正在使用jQuery.getJSON()可能不存在的URL(不同的域).有没有办法让我捕获错误"无法加载资源"?由于此调用的异步性质,似乎try/catch不起作用.

我也不能用jQuery.ajax()"s" error:.从文献:

注意:不会为跨域脚本和JSONP请求调用此处理程序.

Joy*_*tta 11

如果您知道从远程服务返回的成功结果的最坏情况延迟,则可以使用超时机制来确定是否存在错误.

var cbSuccess = false;
$.ajax({
   url: 'http://example.com/.../service.php?callback=?',
   type: 'get',
   dataType: 'json',
   success: function(data) {
              cbSuccess = true;
            }
});
setTimeout(function(){ 
        if(!cbSuccess) { alert("failed"); } 
    }, 2000); // assuming 2sec is the max wait time for results
Run Code Online (Sandbox Code Playgroud)

  • @Matthew Simoneau:该错误被*记录*,而不是*被抛出*.您无法阻止在控制台中记录该错误. (4认同)
  • +1超时是唯一的方法(截至2011年初). (2认同)

Bry*_*ing -2

延迟对象(jQuery 1.5 中的新功能)听起来正是您正在寻找的:

1.5 版中引入的 jQuery.Deferred 是一个可链接的实用程序对象,可以将多个回调注册到回调队列中、调用回调队列以及中继任何同步或异步函数的成功或失败状态。

http://api.jquery.com/category/deferred-object/

编辑:

以下代码对我来说效果很好:

function jsonError(){
    $("#test").text("error");
}

$.getJSON("json.php",function(data){
    $("#test").text(data.a);
}).fail(jsonError);
Run Code Online (Sandbox Code Playgroud)

json.php 看起来像这样:

print '{"a":"1"}';
Run Code Online (Sandbox Code Playgroud)

如果 json.php 的路径不正确或 JSON 格式错误,则会触发错误函数。例如:

print '{xxx"a":"1"}';
Run Code Online (Sandbox Code Playgroud)

  • 不完全的。Deferred 是一种用于同步异步操作结果的通用机制。OP 问题在于检测 JSONP 请求是否失败。 (2认同)