我应该对新的jQuery AJAX代码使用.done()和.fail()而不是成功和错误


166

我这样编码:

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

但是,当我看最后的jQuery .ajax()文档时,似乎建议我在下面进行编码,或者至少建议添加a .done()和a .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;
});

Answers:


164

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

为了与先前的答案一致,请阅读doc:

弃用通知

jQuery 1.8中将弃用jqXHR.success(),jqXHR.error()和jqXHR.complete()回调。要准备将其最终删除的代码,请改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。

如果您使用的是回调处理函数(使用链式方法调用为例),使用.done().fail().always()代替success()error()complete()


54
我不同意。有关的参考文献会谈回调处理函数(例如.error.success),这有利于更普遍的递延模式的过时,但参数的ajax方法不是过时的,都是有效的,可以接受的-即使是在jQuery的1.9 / 2.0!在所有当前形式中,ajax仍然返回Deferred;可能带有已附加的Deferred回调。
user2246674

1
这里是jQuery 1.9,并且成功:,错误:和完成:仍然可用。但是,我的问题是,.done()==是成功吗?
TARKUS

3
@GregoryLewis来自JQuery 1.10源代码:jqXHR.success = jqXHR.done;
Michael Laffargue

9
我喜欢诚实successfailalways
ahnbizcad 2014年

4
哇,我也误读了文档。我从字面上认为$ .ajax的“成功” /“错误”选项被重写为“完成/失败”。只是回调方法链。老实说,我认为他们也应该切换选项名称。那让我难过了几个小时。
OzzyTheGiant

12

我想在@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 */

});

9
您有任何可信且可验证的参考资料吗?
保罗·巴尔加斯

@PaulVargas我从不进行任何性能测试,但是在我的实践中,我发现它可以工作。您可以自己尝试。
伊维安·史蒂芬·斯蒂芬奇

1
请提供任何可信任的证据。
wonsuc

如您所知,与从该函数返回某些对象相比,回调函数要慢一些。有时候影响很小,但是如果您打了很多电话,有时候影响可能很大。
Ivijan StefanStipić,19年

7

简单来说

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

如果它获取了info.text,则它将发出警报,以及您添加的任何功能,或者如果无法从服务器检索info.text,则将发出警报或错误功能。


0

当我们要在旧的现有应用程序中将JQuery从1.x迁移到2x或3.x时,我们将使用.done,.fail而不是success,error,因为JQuery up gradation将不赞成使用这些方法。例如,当我们调用服务器Web方法时,服务器将Promise对象返回到调用方法(Ajax方法),并且该Promise对象包含.done,.fail..etc方法。因此,对于成功和失败响应,我们将相同。下面是示例(用于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.
                });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.