如何在使用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"); } });
通过这种方式,可以轻松地跟踪超时和错误,而无需实现在请求完成后启动的自定义超时跟踪器。
希望这可以帮助有人仍然在寻找这个问题的答案。