js中关于宏任务和微任务执行顺序的部分细节问题

 async function async1() {
    console.log("async1 start");
    await async2();
    console.log("async1 end");
}
async function async2() {
    console.log("async2");
}
async1();
setTimeout(() => {
    console.log("timeout");
}, 0);
new Promise(function(resolve) {
    console.log("promise1");
    resolve();
}).then(function() {
    console.log("promise2");
}).then(function() {
    console.log("promise3");
});
console.log("script end");
process.nextTick(() => {
    console.log("nextTick");
})

运行结果如下:
async1 start
async2
promise1
script end
nextTick
async1 end
promise2
promise3
timeout

我们用上面这段代码来说明几个问题。
1.被await修饰的函数后的代码执行顺序
可能有同学会认为async2方法后面的代码会在async2方法执行完后继续执行,但结果却不是这样。
其实,await是一个让出线程的标志。await后面的函数会先执行一遍,然后就会跳出整个async函数来执行后面js栈中的代码(第一次为同步代码)。等本轮事件循环执行完了之后又会跳回到async函数中等待await。
所以await 后面的代码会在第一轮同步代码执行完后,也就是js执行栈空了之后执行。

2 .连续微任务问题
上面代码中.then()方法后面又跟了一个.then(),它们都属于微任务。
通常情况下,在当前宏任务中的 JavaScript 快执行完成时,也就是在 JavaScript 引擎准备退出全局执行上下文并清空调用栈的时候,JavaScript 引擎会检查全局执行上下文中的微任务队列,然后按照顺序执行队列中的微任务。
如果在执行微任务的过程中,产生了新的微任务,一样会将该微任务添加到微任务队列中,V8 引擎一直循环执行微任务队列中的任务,直到队列清空才算执行结束。也就是说在执行微任务过程中产生的新的微任务并不会推迟到下一个循环中执行,而是在当前的循环中继续执行,这点是需要注意的。

3.process.nextTick()方法
该方法属于nodejs里面的方法,这里我们不深究它的具体用法,这个方法属于微任务,并且它会优先于其他所有微任务执行。

事件循环是面试中经常考察的内容,其实只要我们记住其轮询的规则,注意一些细节,都可以解决这些面试题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值