Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery:deferred.always()和deferred.then()之间有什么区别?_Javascript_Jquery_Jquery Deferred - Fatal编程技术网

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;})--在这种情况下,完成回调将导致跟踪新承诺对象的状态,而失败回调的结果将保持原始延迟对象的状态(在这种情况下被拒绝)。