在跨域请求上捕获JSONP错误

时间:2011-02-07 17:31:27

标签: javascript jquery json error-handling jsonp

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

我也不能使用jQuery.ajax()的“error:”。来自文件:

  

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这有效:

j.ajaxSetup({
    "error":function(xhr, ajaxOptions, thrownError) {   

    console.log(thrownError);                           
}});

答案 2 :(得分:-2)

延迟对象(jQuery 1.5中的新功能)听起来就像你正在寻找的那样:

  

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

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

修改

以下代码适用于我:

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

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

json.php看起来像这样:

print '{"a":"1"}';

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

print '{xxx"a":"1"}';

答案 3 :(得分:-6)

您抱怨的是客户端错误,说您尝试从服务器下载资源。

这是构建到浏览器中,它允许您的浏览器告诉客户端或开发人员从Internet下载资源失败。这与JavaScript无关,并且是由浏览器捕获的HTTP引发的更低级错误。

如果你想要抓住它,你需要放弃第三方ajax库并在更低的层次上处理XMLHTTPRequest对象,即使那时我也怀疑你能做些什么。

基本上,当您看到此错误时,请找出您尝试获取的不存在或无法访问的对象。然后停止访问它或使其可访问。