【发布时间】:2020-10-09 00:12:50
【问题描述】:
我们知道 Promise 是微任务,它们被添加到微任务队列中,而事件监听器/定时器是任务,因此它们被添加到任务队列中。但是,如果事件侦听器/计时器位于 Promise 函数中(在创建 Promise 时将其传递给 Promise 构造函数),那么它们呢?他们被添加到哪个队列中?
console.log("script start");
var promise = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("setTimeout2");
resolve();
}, 0);
});
promise.then(function () {
console.log("promise2");
});
setTimeout(function () {
console.log("setTimeout");
}, 0);
console.log("script end");
这里的“脚本启动”是主要任务的一部分,因此它被执行/打印。
然后promise的回调函数被处理到浏览器,handler把这个加入到微任务队列中。
then() 将回调传递给浏览器的处理程序,它将在主要承诺解决后执行。
promise 之外的 setTimeout 被添加到任务队列中。
“脚本结束”被打印出来。
现在微任务队列上有一个微任务,任务队列上有一个任务。
因此,微任务将首先执行,因为它们的优先级高于任务。
但在任务内部,有一个计时器。
我们知道定时器被添加到任务队列中。但这里我认为定时器被添加到微任务队列中。因为如果它被添加到任务队列,那么稍后会打印“setTimeout2”,因为在任务队列上已经有一个任务打印“setTimeout”。 那么那里实际发生了什么?
【问题讨论】:
标签: asynchronous promise