node中的事件循环

277 阅读1分钟
我们写的js代码会交给v8引擎处理,代码中可能会调用nodeApi,node会交给libuv库处理,libuv通过阻塞i/o和多线程实现了异步io,通过事件驱动的方式,将结果放到了事件队列中,最终交给我们的应用 



在libuv内部有这样一个事件机制,在node启动时会初始化事件环


这里每一个阶段都对应一个事件队列,当eventloop执行到某个阶段时会将当前阶段对应的队列依次执行。当队列执行完毕或者执行的数量超过上线时,会转入下一个阶段

任务可分为宏任务和微任务
macro-task(宏任务): setTimeout, setInterval, setImmediate, I/O
micro-task(微任务): process.nextTick, 原生Promise(有些实现的promise将then方法放到了宏任务中),Object.observe(已废弃), MutationObserver,MessageChannel

在阶段切换时会执行微任务
阻塞和非阻塞指的是调用者的状态
同步和异步指的是被调用者是如何通知的
node代码在执行时,执行是在 栈中执行的,先执行微任务,在执行宏任务,一旦执行到某一个阶段,会等这个阶段的所有代码执行完毕后,再切换到另一个阶段

console.log(1);
setTimeout(function(){ console.log(2);
Promise.resolve(1).then(function(){ console.log('promise') }) }) 

setTimeout(function(){ console.log(3); }) 

先默认走栈 console.log(1); 先走第一个setTimeout,将微任务放到队列中,执行微任务,微任务执行完再走宏任务 (浏览器过程)
在node中,先执行console.log(1),在执行setTimeout,打印出console.log(2),node会继续执行console.log(3),再去执行promise这个微任务  ,结果是123promise;
以上是我对node中事件环的理解,希望对你有帮助