Asynchronous promise中的异步函数(如计时器)在Javascript中是如何处理的?
我们知道承诺是微任务,它们被添加到微任务队列中,事件侦听器/计时器是任务,因此它们被添加到任务队列中。但是,如果事件侦听器/计时器位于promise函数(在创建promise-to-promise构造函数时传递)内,那么它们又如何呢。他们被添加到哪个队列中Asynchronous promise中的异步函数(如计时器)在Javascript中是如何处理的?,asynchronous,promise,Asynchronous,Promise,我们知道承诺是微任务,它们被添加到微任务队列中,事件侦听器/计时器是任务,因此它们被添加到任务队列中。但是,如果事件侦听器/计时器位于promise函数(在创建promise-to-promise构造函数时传递)内,那么它们又如何呢。他们被添加到哪个队列中 console.log(“脚本启动”); var承诺=新承诺(功能(解决、拒绝){ setTimeout(函数(){ console.log(“setTimeout2”); 解决(); }, 0); }); promise.then(函数(
console.log(“脚本启动”);
var承诺=新承诺(功能(解决、拒绝){
setTimeout(函数(){
console.log(“setTimeout2”);
解决();
}, 0);
});
promise.then(函数(){
控制台日志(“承诺书2”);
});
setTimeout(函数(){
console.log(“setTimeout”);
}, 0);
log(“脚本结束”)代码>在承诺中没有什么特别的。放在微任务队列上的唯一函数是传入然后
的回调
以下是实际发生的情况:
执行脚本启动
日志
承诺被创建并调用其执行器回调。executor回调调用setTimeout
,它调度一个计时器
承诺被分配给promise
变量
调用then()
方法并将实现回调附加到承诺
调用第二个setTimeout
,并安排第二个计时器
执行脚本结束
日志
这一切都是在一次任务执行中同步发生的。一段时间后,计时器启动并(只有在那时!)将其(宏)任务添加到计时器事件队列。浏览器处理第一个:
执行setTimeout2
日志
执行resolve()
函数,该函数实现承诺,并将作业添加到微任务队列中以运行实现回调
完成此宏任务后,将处理微任务队列中的任务:
执行promise2
日志
由于微任务队列已为空,因此可以处理下一个宏任务:
执行setTimeout
日志