Node.js中的执行顺序(微任务与事件循环)

本文探讨了Node.js中的异步执行顺序,强调了事件循环和微任务的概念。文章通过一道面试题,详细讲解了process.nextTick、Promise、setTimeout与setImmediate的执行顺序。同步任务结束后,首先执行process.nextTick中的任务,随后是微任务队列(包括Promise回调),然后是次轮循环中的定时器和其他回调。最后,文章澄清了关于async函数和Promise的一些常见误解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提出问题

在理解node.js异步时有一些不懂的地方,使用node.js的开发者一定都知道它是单线程的,异步不阻塞且高并发的一门语言,但是node.js在实现异步的时候,两个异步任务开启了,是谁快就谁先完成这么简单?还是说异步任务最后也会有一个先后执行顺序? 对于一个单线程的的异步语言它是怎么实现高并发的呢?

好接下来我们就带着这两个问题来真正的理解node.js中的异步(微任务与事件循环)。

Node 的异步语法比浏览器更复杂,因为它可以跟内核对话,不得不搞了一个专门的库 libuv 做这件事。这个库负责各种回调函数的执行时间,异步任务最后基于事件循环机制还是要回到主线程,一个个排队执行。

整体结论

先看一张node.js代码执行顺序的图片
网上找到的一张图片

顺序的整体总结就是:
同步任务-> 本轮循环->次轮循环

一道面试题

看下面的面试题,大家可以先试着写一下输出结果,然后再看我下面的详细讲解,看看会不会有什么出入,如果把整个顺序弄清楚node.js的执行顺序应该就没问题了。

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

<

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值