提出问题
在理解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')