javascript - javascript如何在使用JSONP时捕获 $.getJSON ( 或者 $.ajax 数据类型设置为'jsonp') 错误?

  显示原文与译文双语对照的内容
142 4

是否有可能在对jQuery使用JSONP时捕获一个错误?我已经尝试了 $.getJSON 和 $.ajax 方法,但都不会捕获我正在测试的404错误。以下是我尝试的( 记住这些都是成功的,但是我想在失败时处理这些情况):

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

还有:

jQuery.getJSON(handlerURL +"&callback=?", 
 function(jsonResult){
 alert("Success!");
 });

我还尝试添加 $.ajaxError,但这两种方法都不起作用:

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

感谢你的回复 !

时间:原作者:0个回答

85 3

看来没有返回成功结果的sdm请求从来不触发任何事件。成功或者失败,更好或者更糟糕的是设计。

在搜索他们的Bug 跟踪器之后,有一个补丁程序,它可能是一个使用超时回调的可能解决方案。请参见 Bug 报告 #3442.如果你不能捕获错误,你至少可以以在等待合理的时间成功后超时。

原作者:
71 0

这是我对类似问题的广泛答案。

下面是代码:

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!'); });
原作者:
99 4
检测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);

就像thedawnrider中提到的,你也可以使用 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 。相反,它将 <script> 标签插入页面,其中"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> 标记添加到DOM时会发生什么情况?很明显它会被执行。

假设对此查询的响应产生了一个JSON结果,如下所示:

{"answer":42}

对于浏览器,这与脚本来源相同,因这里它会被执行。但是执行这里操作时会发生什么情况:

<script>{"answer":42}</script>

没有,只是个对象。它不会被存储,保存,也不会发生任何事情。

这就是JSONP请求在函数中封装它的结果的原因。必须支持JSONP序列化的服务器将看到你指定的callback 参数,并返回这里参数:

myFunc({"answer":42})

然后执行这里操作:

<script>myFunc({"answer":42})</script>

。这更有用。在代码中的某个地方,是一个名为 myFunc的全局函数:

myFunc(data)
{
 alert("The answer to life, the universe, and everything is:" + data.answer);
}

就是这样,这是JSONP的"魔幻"。然后在超时检查中构建是非常简单的,如 above 所示。发出请求,然后立即启动超时。在X 秒之后,如果你的标志仍未设置,则请求超时。

原作者:
...