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

时间:2012-09-16 15:29:50

标签: javascript jquery jquery-deferred

对我来说,两者都做同样的事情。

文档:

4 个答案:

答案 0 :(得分:33)

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

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

答案 1 :(得分:7)

使用.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();
});

答案 2 :(得分:6)

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

从jQuery 1.8开始:.always(fn).then(fn, fn)类似,但返回的内容不同(详见http://api.jquery.com/deferred.then/

答案 3 :(得分:0)

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