我应该在新的jQuery AJAX代码中使用.done()和.fail()而不是success和error吗?

202

我已经写了这样的代码:

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID },
    success: function (data) {
        $('#CityID').html(data);
    },
    error: function (ajaxContext) {
        alert(ajaxContext.responseText)
    }
});

但是当我查看 jQuery 的 .ajax() 文档 时,最后似乎建议我编写以下代码,或者至少建议添加 .done().fail()

var request = $.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
});

request.done(function (data) {
    xxx;
});
request.fail(function (jqXHR, textStatus) {
    xxx;
});

更新

如果我按照下面的方式编码,是否与将其拆分为三个部分相同,或者拆分为三个部分有一些优势?

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
}).done(function (data) {
    xxx;
}).fail(function (jqXHR, textStatus) {
    xxx;
});
4个回答

191

正如用户2246674所述,使用successerror作为ajax函数的参数是有效的。

为了与之前的回答保持一致,阅读文档:

弃用通知

在jQuery 1.8中,jqXHR.success()、jqXHR.error()和jqXHR.complete()回调将被弃用。为了为其最终的移除做准备,请改用jqXHR.done()、jqXHR.fail()和jqXHR.always()。

如果您正在使用回调操作函数(例如使用方法链),请改用.done().fail().always()代替success()error()complete()


60
我不同意。参考资料讨论了回调函数操作(例如.error.success),它们已经过时,推荐使用更通用的Deferred模式,但是ajax方法的参数没有被弃用,它们仍然是有效和可接受的——即使在jQuery 1.9/2.0中也是如此!在所有目前的形式中,ajax仍然返回一个Deferred,可能已经附加了Deferred回调。 - user2246674
2
这里有jQuery 1.9,success:、error:和complete:仍然可用。但是我的问题是,.done()是否等同于success:? - TARKUS
4
从 jQuery 1.10 源代码中:jqXHR.success = jqXHR.done;。意思是将 jqXHR.done 赋值给 jqXHR.success - Michael Laffargue
11
我会诚实地选择“成功”,“失败”,“始终如一”。 - ahnbizcad
5
哇,我也误读了文档。我真的以为$.ajax中的'success'/'error'选项被重写为'done/fail'了。实际上只是回调方法链的变化。说实话,我认为他们也应该将选项名称更改。这让我困惑了数小时。 - OzzyTheGiant
显示剩余7条评论

15

我想在 @Michael Laffargue 的帖子上添加一些内容:

jqXHR.done() 更快!

jqXHR.success() 在回调中会有一些加载时间,有时可能会导致脚本过度执行。我之前就是这样发现的。

更新:

使用 jqXHR.done()jqXHR.fail()jqXHR.always() 您可以更好地操作ajax请求。通常情况下,您可以将ajax定义为某个变量或对象,并在代码的任何部分使用该变量或对象并更快地获取数据。良好的例子:

/* Initialize some your AJAX function */
function call_ajax(attr){
    var settings=$.extend({
        call            : 'users',
        option          : 'list'
    }, attr );

    return $.ajax({
        type: "POST",
        url: "//exapmple.com//ajax.php",
        data: settings,
        cache : false
    });
}

/* .... Somewhere in your code ..... */

call_ajax({
    /* ... */
    id : 10,
    option : 'edit_user'
    change : {
          name : 'John Doe'
    }
    /* ... */
}).done(function(data){

    /* DO SOMETHING AWESOME */

});

13
你有任何可信且可验证的参考资料吗? - Paul Vargas
@PaulVargas 我从未进行过性能测试,但在我的实践中,我发现这种方法可行。你可以自己尝试一下。 - Ivijan Stefan Stipić
3
请提供可信的证据。 - wonsuc
就像你所知道的,回调函数与从函数返回某些对象相比较慢。有时影响很小,但如果你有很多调用,有时可能会非常大。 - Ivijan Stefan Stipić

14

简单来说

$.ajax("info.txt").done(function(data) {
  alert(data);
}).fail(function(data){
  alert("Try again champ!");
});

如果成功获取info.text,则弹出警报并执行您添加的任何函数,如果无法从服务器检索info.text,则弹出警报或错误函数。


2
我们在将现有应用从jQuery 1.x迁移到2.x或3.x时,将使用.done和.fail代替success和error,因为jQuery即将弃用这些方法。例如,当我们调用服务器Web方法并且服务器返回承诺对象给调用方法(Ajax方法)时,这些承诺对象包含.done、.fail等方法。因此,我们将对成功和失败响应执行相同的操作。以下是一个示例(它是针对POST请求的,同样的方式我们可以构造一个GET请求):
 $.ajax({
            type: "POST",
            url: url,
            data: '{"name" :"sheo"}',
            contentType: "application/json; charset=utf-8",
            async: false,
            cache: false
            }).done(function (Response) {
                  //do something when get response            })
           .fail(function (Response) {
                    //do something when any error occurs.
                });

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