Javascript 为什么javasscript i中此事件循环的结果可以';我不明白?如何解释这个结果
这是一个关于事件循环的问题 代码如下:Javascript 为什么javasscript i中此事件循环的结果可以';我不明白?如何解释这个结果,javascript,node.js,event-loop,Javascript,Node.js,Event Loop,这是一个关于事件循环的问题 代码如下: async函数async1(){ log('async1 start'); 等待async2(); log('async1-end'); } 异步函数async2(){ log('async2 start'); 返回新承诺((解决、拒绝)=>{ 解决(); log('async2 promise'); }) } log('scriptstart'); setTimeout(函数(){ log('setTimeout'); }, 0); async1();
async函数async1(){
log('async1 start');
等待async2();
log('async1-end');
}
异步函数async2(){
log('async2 start');
返回新承诺((解决、拒绝)=>{
解决();
log('async2 promise');
})
}
log('scriptstart');
setTimeout(函数(){
log('setTimeout');
}, 0);
async1();
新承诺(功能(解决){
console.log(“promise1”);
解决();
}).然后(函数(){
console.log(“promise2”);
}).然后(函数(){
控制台日志(“promise3”);
});
log('scriptend');
结果是:
脚本启动
异步1启动
异步2启动
异步2承诺
承诺人1
脚本结束
承诺人2
承诺3
异步1端
设置超时
我不明白为什么“async1 end”
会在“promise 2”
和“promise 3”
之后打印
如何解释这个事件循环?这些微任务推送和弹出队列的顺序是什么?您很惊讶为什么
async1 end
位于promise2
和promise3
之后,尽管它是在它们之前调用的,并且微任务是按照它们排队的顺序执行的
然而,这实际上归结为async
函数需要多少微任务才能解析
看看这个(代码相同,但有4个原始承诺):
async函数async1(){
log('async1 start');
等待async2();
log('async1-end');
}
异步函数async2(){
log('async2 start');
返回新承诺((解决、拒绝)=>{
解决();
log('async2 promise');
})
}
log('scriptstart');
setTimeout(函数(){
log('setTimeout');
}, 0);
async1();
新承诺(功能(解决){
console.log(“promise1”);
解决();
}).然后(函数(){
console.log(“promise2”);
}).然后(函数(){
控制台日志(“promise3”);
}).然后(函数(){
控制台日志(“promise4”);
});
log('scriptend')代码>
/*只是为了让控制台填满可用空间*/
.作为控制台包装{
最大高度:100%!重要;
}
您已经回答了自己的问题:“推送和弹出队列”。除非这些是通过then()
或await
的依赖项,否则事件循环可以在任何await
中断时在它们之间切换。