我们知道承诺是微任务,它们被添加到微任务队列中,事件监听器/定时器是任务,所以它们被添加到任务队列中。但是,如果事件侦听器/定时器在允诺函数中(这个函数是在承诺构造函数的创建过程中传递的),那么事件侦听器/定时器怎么办?它们被添加到哪个队列中?
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");
在这里,“脚本开始”是主要任务的一部分,因此它将被执行/打印。
然后将承诺的回调函数处理为browser,处理程序将其添加到microtask队列中。
然后()将回调传递给浏览器的处理程序,它将在解决主承诺后执行。
超出承诺的setTimeout被添加到任务队列中。
“脚本端”被打印出来。
现在,微任务队列上有一个微任务,任务队列上有一个任务。
因此,微任务将首先执行,因为它们比任务具有更高的优先级。
但是在任务里面有一个计时器。
我们知道定时器被添加到任务队列中。但是在这里,我认为计时器被添加到微任务队列中。因为如果它被添加到任务队列中,那么"setTimeout2“稍后会被打印出来,因为在任务队列中已经有一个输出"setTimeout”的任务。那么那里到底发生了什么呢?
发布于 2020-06-18 20:55:58
“承诺中”没有什么特别之处。放在微任务队列上的唯一函数是传递到then的回调。
下面是实际发生的事情:
,
script start日志被执行,setTimeout,它调度一个定时器。promise变量then()方法并将一个实现回调附加到承诺setTimeout并调度第二个定时器H 216H 117执行script end日志H 219G 220所有这些都是在一个任务执行过程中同步发生的。过了一段时间,定时器就开火了(只有这样!)将其(宏)任务添加到计时器事件队列中。浏览器处理第一个浏览器:
执行setTimeout2日志,执行,执行resolve()函数,履行承诺,并添加作业以运行对微任务队列的实现回调
完成此宏任务后,微任务队列中的任务将被处理:
promise2日志被执行由于microtask队列已经为空,因此可以处理下一个宏任务:
setTimeout日志被执行https://stackoverflow.com/questions/62458424
复制相似问题