如果延迟的回调已被解析,jquery延迟回调是否同步?

如果延迟的回调已被解析,jquery延迟回调是否同步?,jquery,asynchronous,promise,jquery-deferred,Jquery,Asynchronous,Promise,Jquery Deferred,我猜答案是肯定的,但密码不是最容易破译的。它说 任何添加到对象的带有deferred.then()、deferred.always()、deferred.done()或deferred.fail()的回调都将排队等待稍后执行。调用deferred.resolve()或deferred.resolveWith()会将deferred转换为已解析状态,并立即执行任何已设置的doneCallbacks 但这并没有明确地涵盖将回调附加到已解析的延迟的情况。如果承诺已解析/拒绝,则新回调将同步执行 从:

我猜答案是肯定的,但密码不是最容易破译的。它说

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


但这并没有明确地涵盖将回调附加到已解析的延迟的情况。

如果承诺已解析/拒绝,则新回调将同步执行

从:

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

演示():

输出:

在1之前
在1之后
完成1
在2之前
完成2
2点以后


但是请注意,这是jQuery承诺不遵循的方面之一。好吧,
Q
Bluebird
实现都会确保回调异步执行(例如通过
setImmediate
)。@nosratio-有趣。我曾考虑改用蓝鸟,但这种行为实际上会使我更难使用某些功能implement@wheresrhys我看不出确定的执行顺序比随机的执行顺序更难实现feature@wheresrhys蓝鸟实际上有一个构建(恰当地称为Zalgo)来实现这一点。你真的不想这么做。它可能会产生真正“有趣”的bug。@其中唯一的区别是保证有特定的执行顺序,而对于像jQuery这样的实现,执行顺序是不保证的。因此,说这样的保证使某些东西更难实施是荒谬的。
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');