29

在我看来,两者都做同样的事情。

文件:

4

4 回答 4

35

似乎deferred.then()允许您为成功和失败传递两个单独的回调,而deferred.always()需要n多个回调,无论初始事件的结果如何,它们都将被调用。

我会说deferred.always()在初始事件的成功/失败并不重要的情况下使用

于 2012-09-16T15:33:13.377 回答
7

您可以为解决 ( ).then()提供单独的回调,并为拒绝 ( ) 提供另一个回调。$.Deferreddone$.Deferredfail

.always(),另一方面,允许您提供始终执行的回调,无论是否$.Deferred已解决或拒绝。换句话说,在这个回调中,AJAX 调用是失败还是成功执行都没有关系。

.always()当我希望代码每次都运行时,我倾向于放入代码,并且与是否$.Deferred成功解决无关。例如,清除 AJAX 加载指示器或隐藏进度条。使用.then()你会有这样的东西:

$.get("/some/url").then(function () { // done callback
  $(".progress-bar").hide();
}, function () { // fail callback
  $(".progress-bar").hide();
});

如果你使用.always(),你只需要一个回调,因为你总是想隐藏进度条,无论$.Deferred是解决还是拒绝:

$.get("/some/url").always(function () {
  $(".progress-bar").hide();
});
于 2012-09-16T15:34:37.467 回答
6

在 jQuery 1.8 之前:.always(fn)相当于.then(fn, fn)

从 jQuery 1.8 开始:.always(fn)类似于.then(fn, fn)但返回的内容不同(有关详细信息,请参阅http://api.jquery.com/deferred.then/

于 2012-09-24T15:15:29.400 回答
0

(从 1.8 开始)的最大好处then是能够显式链接任务,因为它返回一个承诺,该承诺将通过回调的结果来解决

文档中的示例:

var request = $.ajax( url, { dataType: "json" } ),
    chained = request.then(function( data ) {
      return $.ajax( url2, { data: { user: data.userId } } );
    });

chained.done(function( data ) {
  // data retrieved from url2 as provided by the first request
});
于 2013-07-02T14:19:13.623 回答