Javascript 使用jsonp时,如何捕捉jQuery$.getJSON(或数据类型设置为';jsonp';)错误?

Javascript 使用jsonp时,如何捕捉jQuery$.getJSON(或数据类型设置为';jsonp';)错误?,javascript,jquery,jsonp,Javascript,Jquery,Jsonp,在jQuery中使用JSONP时是否可能捕获错误?我已经尝试了$.getJSON和$.ajax方法,但两者都不能捕获我正在测试的404错误。以下是我尝试过的(请记住,所有这些都能成功工作,但我希望在失败时处理): 而且: jQuery.getJSON(handlerURL + "&callback=?", function(jsonResult){ alert("Success!"); }); 我还尝试添加$.ajaxError,但也没有成功: jQu

在jQuery中使用JSONP时是否可能捕获错误?我已经尝试了$.getJSON和$.ajax方法,但两者都不能捕获我正在测试的404错误。以下是我尝试过的(请记住,所有这些都能成功工作,但我希望在失败时处理):

而且:

jQuery.getJSON(handlerURL + "&callback=?", 
    function(jsonResult){
        alert("Success!");
    });
我还尝试添加$.ajaxError,但也没有成功:

jQuery(document).ajaxError(function(event, request, settings){
   alert("Error");
});

提前感谢您的回复

不返回成功结果的JSONP请求似乎永远不会触发任何事件,成功或失败,不管是好是坏,这显然是出于设计


在搜索他们的bug跟踪器之后,有一个可能的解决方案,使用超时回调。看见如果无法捕获错误,您至少可以在等待一段合理的成功时间后超时。

这似乎正在起作用:

jQuery(document).ajaxError(function(event, request, settings){
   alert("Error");
});

如果与提供程序协作,则可以在出现错误时发送另一个查询字符串参数作为回调函数

回调=?&错误=

这叫做JSONPE,但它根本不是一个实际的标准

然后,提供程序将信息传递给错误函数,以帮助您进行诊断


但是对于通信错误没有帮助-jQuery必须更新,以便在超时时也回调error函数,就像Adam Bellaire的回答一样。

我使用它来捕获JSON错误

try {
   $.getJSON(ajaxURL,callback).ajaxError();
} catch(err) {
   alert("wow");
   alert("Error : "+ err);
}
编辑:或者,您也可以获得错误消息。这将让您知道错误的确切含义。在catch块中尝试以下语法

alert("Error : " + err);
检测JSONP问题 如果不想下载依赖项,可以自己检测错误状态。这很容易

您只能通过使用某种超时来检测JSONP错误。如果在特定时间内没有有效的响应,则假定出现错误。不过,错误基本上可以是任何东西

这里有一个检查错误的简单方法。只需使用
success
标志:

var success = false;

$.getJSON(url, function(json) {
    success = true;
    // ... whatever else your callback needs to do ...
});

// Set a 5-second (or however long you want) timeout to check for errors
setTimeout(function() {
    if (!success)
    {
        // Handle error accordingly
        alert("Houston, we have a problem.");
    }
}, 5000);
正如注释中提到的Dawnrider,您也可以使用clearTimeout:

var errorTimeout = setTimeout(function() {
    if (!success)
    {
        // Handle error accordingly
        alert("Houston, we have a problem.");
    }
}, 5000);

$.getJSON(url, function(json) {
    clearTimeout(errorTimeout);
    // ... whatever else your callback needs to do ...
});
为什么??继续读


简而言之,JSONP的工作原理如下: JSONP不像常规AJAX请求那样使用XMLHttpRequest。相反,它将
标记注入页面,其中“src”属性是请求的URL。响应的内容被包装在Javascript函数中,然后在下载时执行该函数

例如。

JSONP请求:
https://api.site.com/endpoint?this=that&callback=myFunc

Javascript将此脚本标记注入DOM:

<script src="https://api.site.com/endpoint?this=that&callback=myFunc"></script>
对于浏览器来说,这与脚本的源代码是一样的,所以它会被执行。但当您执行此操作时会发生什么:

<script>{"answer":42}</script>
然后执行以下操作:

<script>myFunc({"answer":42})</script>
就这样。这就是JSONP的“魔力”。然后构建超时检查非常简单,如上图所示。发出请求,然后立即开始超时。X秒后,如果您的标志仍未设置,则请求超时。

这是否有效

.complete(function(response, status) {
    if (response.status == "404")
        alert("404 Error");
    else{
        //Do something
    }   
    if(status == "error")
        alert("Error");
    else{
        //Do something
    }
});

我不知道状态何时进入“错误”模式。但是我用404对它进行了测试,它的响应是

您可以通过在ajax请求中添加此属性来显式处理任何错误号:

statusCode: {
        404: function() {
          alert("page not found");
        }
    }
因此,您的代码应该如下所示:

jQuery.ajax({
type: "GET",
statusCode: {
        404: function() {
          alert("page not found");
        }
},
url: handlerURL,
dataType: "jsonp",
success: function(results){
    alert("Success!");
},
error: function(XMLHttpRequest, textStatus, errorThrown){
    alert("Error");
}
});

希望这对你有所帮助:)

我知道这个问题有点老了,但我没有看到一个简单的答案,所以我想我会分享我的“简单”解决方案

$.getJSON("example.json", function() {
      console.log( "success" );
}).fail(function() { 
      console.log( "error" ); 
}); 
我们可以简单地使用
.fail()
回调来检查是否发生了错误

希望这有帮助:)这是我对一个类似问题的广泛回答

代码如下:

jQuery.getJSON(handlerURL + "&callback=?", 
    function(jsonResult){
        alert("Success!");
    })
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });

我也在网上发布了这个答案

我知道已经有一段时间没有人回答了,海报可能已经从这里或其他地方得到了答案。然而,我认为这篇文章将帮助任何人寻找一种方法来跟踪执行getJSON请求时的错误和超时。因此,下面是我对这个问题的回答

getJSON结构如下(在上找到):

大多数人使用

$.getJSON(url, datatosend, function(data){
    //do something with the data
});
其中,他们使用url变量提供到JSON数据的链接,datatosend作为添加
“?callback=?”
和其他必须发送才能返回正确JSON数据的变量的位置,以及success函数作为处理数据的函数

但是,您可以在success函数中添加status和xhr变量。状态变量包含以下字符串之一:“success”、“notmodified”、“error”、“timeout”或“parserror”,xhr变量包含返回的XMLHttpRequest对象 ()

通过这种方式,可以轻松跟踪超时和错误,而无需实现一个定制的超时跟踪程序,该程序在请求完成后即可启动


希望这对仍在寻找这个问题答案的人有所帮助。

使用“error:function(){}”有什么错?它没有触发。(记住这是JSONP)。错误报告#3442链接已断开。这也许是正确的链接:同意!!!有一个问题,即使我打了一个JSONP电话,得到了404错误,但我没有得到406和401???为什么?错误的答案,正确的答案是描述.fail(function())用法的答案。这个答案不应该是简明的。正确的答案是正确的。你也可以使用
jsonpFailCheck=setTimeout(…)
而不是
success=true
你可以使用
cleartimout(jsonpFailCheck)
我们甚至可以检查错误功能的响应状态。我们可以更好地利用error函数。如何对异步调用执行try/catch?就try/catch而言,调用立即结束。回调或任何错误都会在我们离开此代码的作用域很久之后发生
jQuery.ajax({
type: "GET",
statusCode: {
        404: function() {
          alert("page not found");
        }
},
url: handlerURL,
dataType: "jsonp",
success: function(results){
    alert("Success!");
},
error: function(XMLHttpRequest, textStatus, errorThrown){
    alert("Error");
}
});
$.getJSON("example.json", function() {
      console.log( "success" );
}).fail(function() { 
      console.log( "error" ); 
}); 
jQuery.getJSON(handlerURL + "&callback=?", 
    function(jsonResult){
        alert("Success!");
    })
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });
$(selector).getJSON(url,data,success(data,status,xhr))
$.getJSON(url, datatosend, function(data){
    //do something with the data
});
$.getJSON(url, datatosend, function(data, status, xhr){
    if (status == "success"){
        //do something with the data
    }else if (status == "timeout"){
        alert("Something is wrong with the connection");
    }else if (status == "error" || status == "parsererror" ){
        alert("An error occured");
    }else{
        alert("datatosend did not change");
    }         
});