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

whe*_*hys 3 jquery asynchronous promise jquery-deferred

我猜答案是肯定的,但代码并不是最简单的解密.它在文档中

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

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

Aru*_*hny 8

如果已经解析/拒绝了promise,则会同步执行新的回调.

来自jQuery.deferred()doc:

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

演示(小提琴):

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');
Run Code Online (Sandbox Code Playgroud)

输出:

1前
1后
进行1
前2
做2
2后

  • 但请注意,这是jQuery承诺**不遵循**[Promises/A + specs](http://promises-aplus.github.io/promises-spec)的那些方面之一.AFAIK,'Q`和`Bluebird`实现都将确保回调异步执行(例如通过`setImmediate`). (3认同)
  • @Noseratio - 有趣.我正在考虑转换到Bluebird,但这种行为实际上会让我更难实现某些功能 (2认同)