jQuery的ajax()中,使用success、error、complete和使用.done()、.fail()和.always()的区别。

80

问题:

  1. 我们应该根据下面的建议更改我们的编码吗?
  2. .done()success:.fail()error:以及.always()complete:之间有什么区别吗?

前言:

我正在组合一个jQuery.ajax调用,这在过去也做过成功的事情。像这样:

    $.ajax(
    {
        url: someUrl,
        type: 'POST',
        data: someData,
        datatype: 'json',
        success: function (data) { someSuccessFunction(data); },
        error: function (jqXHR, textStatus, errorThrown) { someErrorFunction(); }
    });

在查看文档时,我看到一个参考文献指出,自jQuery 1.8版起,成功、错误和完成回调已经被弃用。为了准备您的代码迎接它们最终的移除,请改用jqXHR.done()、jqXHR.fail()和jqXHR.always()。

因此,我们应该开始像这样编写代码:

$.ajax( "example.php" )
    .done(function (data) { someSuccessFunction(data); })
    .fail(function (jqXHR, textStatus, errorThrown) { someErrorFunction(); })
    .always(function() { alert("complete"); });

1
我更喜欢第二种方法...使用由Ajax返回的Promise。 - Arun P Johny
9
回调函数并没有被弃用,只是 jqxhr 对象上的相关方法被废弃了。 - user2437417
我同意Arun的观点,而且我认为这样更容易阅读。 - Rooster
1
我不想听到有关偏好的评论和陈述,但我希望了解它们之间是否存在差异。 - PostureOfLearning
16
对于那些不知道jqxhr对象是什么的人,Crazy Train所说的“回调函数并未被弃用。jqxhr对象上的相关方法已经被弃用。”的意思是.done()代替了.success().fail()代替了.error().always()代替了.complete().success().error().complete()这三个方法.ajax()方法的successerrorcomplete这三个选项是不同的。 - ahnbizcad
1个回答

41

在这种特定情况下,这样做没有任何优势。

.done() .fail() .always() 方法的重点是您可以:

  1. 附加多个处理程序
  2. 随时随地这样做,而不仅仅在调用$.ajax时。

如果您只在$.ajax调用站点处附加单个处理程序,则这些优点并不真正发挥作用。

因此,您可以返回承诺,其他人可以附加自己的处理程序。

例如,在Ajax请求后刷新插件:

$.ajaxPrefilter(function(opt, origOpt, jqxhr) {
    jqxhr.always(function() {
        $("[data-plugin]").plugin();
    });
});

4
据jQuery官方文档(http://api.jquery.com/jQuery.ajax/)所述,自jQuery 1.5版本起,“complete”、“error”和“success”选项可以接受一个回调函数数组,因此您可以附加多个处理程序。 - user9645
1
  1. 除了在调用 $.ajax() 时使用,这些方法还会在哪些地方被使用?这些方法只能在 jqxhr 接收器上工作吗?
- ahnbizcad

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