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

时间:2008-11-21 19:48:36

标签: javascript jquery jsonp

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

提前感谢您的回复!

10 个答案:

答案 0 :(得分:52)

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

以下是代码:

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

答案 1 :(得分:51)

似乎没有返回成功结果的JSONP请求永远不会触发任何事件,成功或失败,以及显然是设计的好坏。

在搜索他们的错误跟踪器之后,a patch可能是使用超时回调的可能解决方案。见bug report #3442。如果您无法捕获错误,那么在等待合理的时间成功后,您至少可以超时。

答案 2 :(得分:15)

检测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。相反,它会在页面中注入<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的“神奇”。然后构建一个超时检查非常简单,如上所示。发出请求后立即开始超时。在X秒后,如果您的标志仍未设置,则请求超时。

答案 3 :(得分:14)

我知道这个问题有点旧,但我没有看到答案,只能解决问题,所以我想我会分享我的简单问题。解。

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

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

希望这会有所帮助:)

答案 4 :(得分:3)

如果您与提供商合作,则可以在发生错误时发送另一个查询字符串参数作为回调函数。

回调=安培;?错误=

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

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

虽然没有帮助传递错误 - jQuery必须更新以在超时时回调错误函数,如Adam Bellaire的回答。

答案 5 :(得分:2)

现在似乎正在运作:

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

答案 6 :(得分:1)

我用它来捕获JSON错误

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

编辑:或者您也可以收到错误消息。这将让您知道错误是什么。请尝试使用catch块中的以下语法

alert("Error : " + err);

答案 7 :(得分:0)

Mayby有效吗?

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

我不知道状态何时进入“错误”模式。但我用404测试了它并且它回复了

答案 8 :(得分:0)

您可以通过在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");
}
});

希望这可以帮助你:)

答案 9 :(得分:0)

我也在stackoverflow - Error handling in getJSON calls

中发布了这个答案

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

getJSON结构如下(在http://api.jqueri.com上找到):

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

大多数人使用

实现这一点
$.getJSON(url, datatosend, function(data){
    //do something with the data
});

他们使用url var提供JSON数据的链接,datatosend作为添加"?callback=?"的地方和其他必须发送的变量来获取返回的正确JSON数据,并且成功函数作为处理数据的函数。

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

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

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

希望这有助于某人仍在寻找这个问题的答案。