在我看来,两者都做同样的事情。
文档:
-
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
});