Javascript 使用jsonp时,如何捕捉jQuery$.getJSON(或数据类型设置为';jsonp';)错误?
在jQuery中使用JSONP时是否可能捕获错误?我已经尝试了$.getJSON和$.ajax方法,但两者都不能捕获我正在测试的404错误。以下是我尝试过的(请记住,所有这些都能成功工作,但我希望在失败时处理): 而且: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.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");
}
});