Javascript jQuery:deferred.always()和deferred.then()之间有什么区别?
在我看来,两者都做同样的事情 文件:Javascript jQuery:deferred.always()和deferred.then()之间有什么区别?,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,在我看来,两者都做同样的事情 文件: 似乎deferred.then()允许您为成功和失败传递两个单独的回调,而deferred.always()接受n回调的次数,无论初始事件的结果如何,都将调用这些回调 如果初始事件的成功/失败与无关,我会说使用deferred.always()。然后()您可以为$deferred解决(完成)提供一个单独的回调,为$deferred拒绝(失败)提供另一个回调 另一方面,.always()允许您提供始终执行的回调,无论$.Deferred是否已解析或拒绝。
deferred.then()
允许您为成功和失败传递两个单独的回调,而deferred.always()
接受n
回调的次数,无论初始事件的结果如何,都将调用这些回调
如果初始事件的成功/失败与无关,我会说使用deferred.always()
。然后()
您可以为$deferred
解决(完成
)提供一个单独的回调,为$deferred
拒绝(失败
)提供另一个回调
另一方面,.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)
等同于。然后(fn,fn)
从jQuery 1.8开始:
.always(fn)
与类似。then(fn,fn)
但是它在返回的内容上有所不同(详情请参见)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
});
另外,
.then(fn1,fn2)
可以被认为是.done(fn1).fail(fn2)
的简写。哇,谢谢。愚蠢的我。我盯着文档看了一段时间,并没有注意到其中的差异。请注意@Ignitor下面的回答,它引用了deferred.then()
callbacks可以返回新的promise对象以进行进一步的异步处理(什么deferred.pipe()
用于执行)。例如:deferred.then(function(){returnsomenewdeferredthing;},function(){returnnull;})代码>--在这种情况下,完成回调将导致跟踪新承诺对象的状态,而失败回调的结果将保持原始延迟对象的状态(在这种情况下被拒绝)。