是发送到事件队列的承诺回调
Are promise callbacks sent to Event queue?
请考虑以下代码:
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
我在想承诺回调被发送到事件队列,所以我期待这些结果:
timeout finished
Calling promiseOne
promiseOne done
如果不发送到事件队列,我希望:
Calling promiseOne
promiseOne done
timeout finished
有人可以向我解释为什么我会得到第一个三合会吗?
附言通过用done替换,我得到:
Calling promiseOne
promiseOne done
timeout finished
Promise 的 jQuery
实现不符合 ECMASCRIPT 标准,例如,jQuery Promise(实际上)不会在下一个事件循环中解析。 jQuery Promises将与即将推出的第三个版本兼容:jQuery.Deferred现在与Promises/A+兼容。
注意:您是否尝试在异步函数中运行starter.resolve()
?例如:window.setTimeout(starter.resolve, 0)
;这样做,您的测试用例应该按预期工作。顺便说一下,这不是一个 Promise-bug,而是一个简单的 jQuery-bad-implementation,请记住,jQuery 是在 Promise 规范之前一年诞生
为了回复:
promise 回调是简单的 javascript 回调,承诺回调会发送到事件队列吗?
因此,当每个简单的 javascript 回调时,甚至 promise 回调都附加到事件循环中。
相关文章:
- 承诺在非节点式回调上使用Bluebird
- 角承诺的“then”函数的成功回调的词汇范围是什么?
- JQuery 承诺已经包含回调的函数
- JavaScript - 返回承诺和/或调用回调
- 承诺中的成功回调不会发生$http
- 如何重构“;回调金字塔”;转换为基于承诺的版本
- 承诺在Protractor中进行回调排序
- Javascript承诺动态回调
- 编写一个使用传递两个参数的回调的承诺
- Phantom.js-如何使用承诺而不是回调
- 在第一次错误回调时退出承诺链
- 如何获取 Ember 组件对象内部承诺成功或错误回调
- 创建承诺回调
- 回调/承诺无法正常工作
- 承诺回调的触发顺序是什么
- 承诺回调返回承诺
- 使用控制台.log作为承诺回调
- 是发送到事件队列的承诺回调
- 非异步承诺回调
- 在javascript中使用承诺/回调来等待函数完成