如果延迟已经解决,jquery延迟回调是否同步?

时间:2014-03-25 11:40:34

标签: jquery asynchronous promise jquery-deferred

我猜答案是肯定的,但代码并不是最容易破解的。并在docs中说

  

使用deferred.then(),deferred.always(),deferred.done()或deferred.fail()添加到对象的任何回调都排队等待稍后执行。调用deferred.resolve()或deferred.resolveWith()会将Deferred转换为已解析状态,并立即执行所有已设置的doneCallback。

但是这并未明确涵盖将回调附加到已解决的Deferred的情况。

1 个答案:

答案 0 :(得分:8)

如果已经解决/拒绝了承诺,则会同步执行新的回调。

来自jQuery.deferred() doc

  

一旦对象进入已解决或被拒绝状态,它就会保持该状态。回调仍然可以添加到已解决或被拒绝的延期 - 它们将立即执行。

演示(Fiddle):

var def = jQuery.Deferred(),
    promise = def.promise();
console.log('before 1');
promise.done(function () {
    console.log('done 1');
});
console.log('after 1');
def.resolve();
console.log('before 2');
promise.done(function () {
    console.log('done 2');
});
console.log('after 2');

输出:

  <1>之前1   之后1   完成1
  在2之前   完成2
  2之后