请考虑以下代码:
function wait(ms) {
var deferred = $.Deferred();
setTimeout(deferred.resolve, ms);
return deferred.promise();
}
var starter, promiseOne;
starter = $.Deferred();
promiseOne = starter.then(function () {
console.log("Calling promiseOne");
return wait(2000);
}).done(function () {
console.log('promiseOne done');
});
starter.resolve();
var now=new Date().getTime();
var stop=now+5000;
while (stop>new Date().getTime()){}
console.log('timeout finished');
通过运行它,我得到以下结果:
Calling promiseOne
timeout finished
promiseOne done
我在想将promise回调发送到Event队列,所以我期待这些结果:
timeout finished
Calling promiseOne
promiseOne done
如果没有发送到事件队列,我希望:
Calling promiseOne
promiseOne done
timeout finished
有人可以向我解释为什么我会得到第一个黑社会?
P.S。用完成替换然后,我得到:
Calling promiseOne
promiseOne done
timeout finished
答案 0 :(得分:0)
Promises 的jQuery实现不符合ECMASCRIPT ,例如, jQuery promises(实际上)未在下一个事件循环中解析。 jQuery promises将符合即将推出的第三个版本:jQuery.Deferred is now Promises/A+ compatible。
注意:您是否尝试在异步功能中运行starter.resolve()
?例如:window.setTimeout(starter.resolve, 0)
;
这样做你的测试用例应该按预期工作。
顺便说一句,这不是一个Promise-bug而是一个简单的jQuery-bad-implementation,请记住jQuery是在Promise规范出现前一年出生的
以回复:
将承诺回调发送到事件队列吗?
Promise回调是简单的javascript回调,因此,每个简单的javascript回调,甚至承诺回调都附加到事件循环。