jQuery:deferred.always() 和 deferred.then() 有什么区别



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

文档:

  • deferred.always()

  • deferred.then()

似乎deferred.then()允许您传递两个单独的回调以获得成功和失败,而deferred.always()接受n数量的回调,无论初始事件的结果如何,这些回调都将被调用。

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

使用 .then() 时,您可以为解析$.Deferred提供单独的回调 ( done ),为$.Deferred被拒绝时提供另一个回调 ( fail )。

另一方面,.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();
});

在 jQuery 1.8 之前: .always(fn) 等效于 .then(fn, fn)

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

then的最大

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

文档中的示例:

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
});

最新更新