Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么javasscript i中此事件循环的结果可以';我不明白?如何解释这个结果_Javascript_Node.js_Event Loop - Fatal编程技术网

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
中断时在它们之间切换。