我猜答案是肯定的,但代码并不是最容易破解的。并在docs中说
使用deferred.then(),deferred.always(),deferred.done()或deferred.fail()添加到对象的任何回调都排队等待稍后执行。调用deferred.resolve()或deferred.resolveWith()会将Deferred转换为已解析状态,并立即执行所有已设置的doneCallback。
但是这并未明确涵盖将回调附加到已解决的Deferred的情况。
答案 0 :(得分:8)
如果已经解决/拒绝了承诺,则会同步执行新的回调。
一旦对象进入已解决或被拒绝状态,它就会保持该状态。回调仍然可以添加到已解决或被拒绝的延期 - 它们将立即执行。
演示(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之后