Asynchronous promise中的异步函数(如计时器)在Javascript中是如何处理的?

Asynchronous promise中的异步函数(如计时器)在Javascript中是如何处理的?,asynchronous,promise,Asynchronous,Promise,我们知道承诺是微任务,它们被添加到微任务队列中,事件侦听器/计时器是任务,因此它们被添加到任务队列中。但是,如果事件侦听器/计时器位于promise函数(在创建promise-to-promise构造函数时传递)内,那么它们又如何呢。他们被添加到哪个队列中 console.log(“脚本启动”); var承诺=新承诺(功能(解决、拒绝){ setTimeout(函数(){ console.log(“setTimeout2”); 解决(); }, 0); }); promise.then(函数(

我们知道承诺是微任务,它们被添加到微任务队列中,事件侦听器/计时器是任务,因此它们被添加到任务队列中。但是,如果事件侦听器/计时器位于promise函数(在创建promise-to-promise构造函数时传递)内,那么它们又如何呢。他们被添加到哪个队列中

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
    日志