Jam*_*all 33

这似乎是deferred.then()可以让你通过对成功和失败两个单独的回调,而deferred.always()需要n回调将全部不管初始事件的结果叫号.

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

  • 另外,`.then(fn1,fn2)`可以被认为是`.done(fn1).fail(fn2)`的简写. (16认同)
  • 哇谢谢.愚蠢的我.我现在正在盯着文档一段时间而没有注意到差异. (2认同)

Joã*_*lva 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();
});
Run Code Online (Sandbox Code Playgroud)

虽然如果你使用过.always(),你只需要一个回调,因为你总是想要隐藏进度条,无论是否$.Deferred已经解决或拒绝:

$.get("/some/url").always(function () {
  $(".progress-bar").hide();
});
Run Code Online (Sandbox Code Playgroud)


Ign*_*tor 6

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

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