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)
相当于.always(fn)
.then(fn, fn)
从jQuery 1.8开始: .always(fn)
类似于.always(fn)
.then(fn, fn)
但返回的内容不同(详见http://api.jquery.com/deferred.then/ )
then
(从1.8开始)的最大好处是能够明确地链接任务,因为它返回一个将通过回调的结果解决的promise。
文档示例:
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 });