如何在使用JSONP时捕获jQuery $ .getJSON(或$ .ajax,数据types设置为'jsonp')错误?

使用JSONP与jQuery时可能会发生错误吗? 我已经尝试了$ .getJSON和$ .ajax方法,但都不会捕获我正在testing的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"); }); 

在此先感谢您的答复!

看起来,JSONP要求不会返回一个成功的结果,从来没有触发任何事件,成功或失败,无论好坏,这显然是由devise。

search他们的bug跟踪器后,有一个补丁可能是一个使用超时callback的解决scheme。 查看错误报告#3442 。 如果您无法捕获错误,则至less等待一段时间后才能成功。

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

代码如下:

 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!'); }); 

检测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); 

正如注释中提到的那样,你也可以使用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 ://api.site.com/endpoint https://api.site.com/endpoint?this=that&callback=myFunc this https://api.site.com/endpoint?this=that&callback=myFunc that https://api.site.com/endpoint?this=that&callback=myFunc callback https://api.site.com/endpoint?this=that&callback=myFunc 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的“魔力”。 然后在超时检查中build立非常简单,如上所示。 发出请求并立即启动超时。 X秒后,如果你的标志还没有设置,那么请求超时。

我知道这个问题是有点老,但我没有看到一个答案,给出了一个简单的解决scheme,所以我想我会分享我的'简单'的解决scheme。

 $.getJSON("example.json", function() { console.log( "success" ); }).fail(function() { console.log( "error" ); }); 

我们可以简单地使用.fail()callback来检查是否发生错误。

希望这可以帮助 :)

如果您与提供者协作,则可以在发生错误时发送另一个查询string参数作为callback函数。

?callback=?&错误=?

这被称为JSONPE,但它根本不是事实上的标准。

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

虽然没有帮助,但通信错误 – jQuery将不得不更新,也callback超时错误函数,如亚当贝莱尔的答案。

似乎现在正在工作:

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

我用这个来捕获一个JSON错误

 try { $.getJSON(ajaxURL,callback).ajaxError(); } catch(err) { alert("wow"); alert("Error : "+ err); } 

编辑:另外,你也可以得到错误信息。 这会让你知道错误是什么。 在catch块中尝试下面的语法

 alert("Error : " + err); 

Mayby这个工作?

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

我不知道状态何时进入“错误”模式。 但我用404testing了它,并作出了回应

您可以通过在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调用中的error handling

我知道这已经有一段时间了,因为有人在这里回答,海报可能已经从这里或从其他地方得到了他的答案。 不过,我认为这篇文章将帮助任何人在寻找getJSON请求的同时追踪错误和超时。 因此,下面我回答这个问题

getJSON结构如下(可在http://api.jqueri.com上find):;

 $(selector).getJSON(url,data,success(data,status,xhr)) 

大多数人实现使用

 $.getJSON(url, datatosend, function(data){ //do something with the data }); 

在那里他们使用URL var提供一个链接到JSON数据,datatosend作为添加"?callback=?" 和其他必须发送的variables来获取正确的JSON数据返回,以及作为函数处理数据的成功funcion。

然而,你可以在你的成功函数中添加status和xhrvariables。 statusvariables包含以下string之一:“success”,“notmodified”,“error”,“timeout”或“parsererror”,而xhrvariables包含返回的XMLHttpRequest对象( 可在w3schools上find )

 $.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"); } }); 

通过这种方式,可以轻松地跟踪超时和错误,而无需实现在请求完成后启动的自定义超时跟踪器。

希望这可以帮助有人仍然在寻找这个问题的答案。