jQuery:处理 AJAX 请求失败的备选方案

44

jQuery能为失败的AJAX调用提供备用方案吗?这是我的尝试:

function update() {
    var requestOK = false;

    $.getJSON(url, function(){
        alert('request successful');
        requestOK = true;
    });

    if (!requestOK) {
        alert('request failed');
    }
}

不幸的是,即使调用了$.getJSON()方法的回调函数,我也会在回调函数有机会设置requestOK变量之前收到“请求失败”的消息。我认为这是因为代码并行运行的缘故。有没有办法处理这种情况?我考虑过链接或某种等待AJAX请求的方式,包括其回调函数。但如何实现?有人知道怎么做吗?

5个回答

91

您需要使用较低级别的$.ajax调用或ajaxError函数。以下是使用$.ajax方法的示例:

function update() {
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    timeout: 5000,
    success: function(data, textStatus ){
       alert('request successful');
    },
    fail: function(xhr, textStatus, errorThrown){
       alert('request failed');
    }
  });
}

编辑:我在$.ajax调用中添加了一个timeout并将其设置为五秒钟。


这很不错!但如果互联网连接中断,似乎它不能正常工作 :( 这非常重要,因为我正在开发一个适用于OSX的仪表盘小部件,想要显示某种消息,说明请求不可能。还有其他建议吗? - Patrick Oscity
@Patrick,我更新了我的答案,加入了timeout参数。如果互联网连接断开,它将在5秒后调用错误函数。 - Doug Neiner
抱歉给你添了那么多麻烦!我开了一个新问题,因为我认为我的原始问题基本得到了回答,并且将其移动到新的问题更合适。没想到我的第二个问题的答案与第一个问题有这么大的关系;) 尽管如此,我高兴得太早了。即使我将超时参数设置为1(这绝对是不现实的),它仍然无法返回错误函数。可能超时参数被其他东西覆盖了吗? - Patrick Oscity
没关系,我可能有点敏感了。让我再仔细研究一下。既然你现在有另一个问题,我会在那里发布我的发现 :) - Doug Neiner
对我来说没问题,就是当服务器宕机或会话过期时。谢谢! - tom

14

Doug的回答是正确的,但实际上你可以使用$.getJSON并捕获错误(不必使用$.ajax)。只需将getJSON调用与fail函数的调用链接起来:

$.getJSON('/foo/bar.json')
    .done(function() { alert('request successful'); })
    .fail(function() { alert('request failed'); });

演示: http://jsfiddle.net/NLDYf/5/

这种行为是jQuery.Deferred接口的一部分。
基本上,它允许您在调用异步操作之后将事件附加到该操作之后,这意味着您不必将事件函数传递给操作。

在这里阅读有关jQuery.Deferred的更多信息:http://api.jquery.com/category/deferred-object/


1
自jQuery v1.8起,.error()已被弃用,您应该使用.fail() - Cobby

3

我更喜欢这种方法,因为你可以返回 Promise 并在任何需要的地方使用 .then(successFunction, failFunction)。

var promise = $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    timeout: 5000
  }).then(function( data, textStatus, jqXHR ) {
    alert('request successful');
  }, function( jqXHR, textStatus, errorThrown ) {
    alert('request failed');
});

//also access the success and fail using variable
promise.then(successFunction, failFunction);

3
是的,它被内置在jQuery中。请参阅jQuery文档
ajaxError可能是你想要的。

2

我相信你所寻找的是jquery ajax对象 的错误选项。

getJSON是$.ajax对象的包装器,但它不提供访问错误选项的功能。

编辑: dcneiner已经给出了你需要使用的代码示例。(甚至在我回复之前)


关于 getJSON 不提供访问错误的说法是错误的。您可以通过链接 getJSON 调用来访问错误选项。请参见 @Lasse Dahl Ebert 的答案。 - Fydo
1
@Fydo - 这个答案实际上比jQuery的Deferred早了一年;-) 当时,没有办法获取错误信息,你必须降级到$.ajax方法。 - Sean Vieira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接