node事件循环(event loop)

文章详细阐述了Node.js的事件循环机制,包括Timers、I/Ocallbacks、Poll、Check等六个阶段,以及setTimeout、setImmediate、Promise和process.nextTick的执行优先级。在事件循环中,process.nextTick的回调会在当前阶段结束时优先执行,而setImmediate则在Check阶段处理。
摘要由CSDN通过智能技术生成

Node中事件循环的具体流程图
在这里插入图片描述

事件循环分成了6个不同的阶段,其中每个阶段都维护着一个回调函数的队列,在不同的阶段,事件循环会处理不同类型的事件,其代表的含义分别为:

  • Timers:用来处理setTimeOut()和setInterval()的回调。
  • I/O callbacks:大多数的回调方法在这个阶段执行,除了timers、 close和setImmediate事件的回调。
  • idle, prepare:仅仅在内部使用,我们不管它。
  • Poll:轮询,不断检查有没有新的IO事件,事件循环可能会在这里阻塞。
  • Check:处理setImmediate()事件的回调。
  • close callbacks:处理一些close相关的事件,例如socket.on(‘close’, …)。
console.log('script start');

setTimeout(function(){
  console.log('setTimeout-0');
}, 0)

setTimeout(function(){
  console.log('setTimeout-10');
}, 10)

setImmediate(() => {
  console.log('setImmediate');
})

new Promise((resolve,reject) => {
  console.log('Promise-new');
  resolve()
}).then(() => {
  console.log('promise-then');
})

console.log('script end');
script start
Promise-new 
script end  
promise-then
setImmediate
setTimeout-0
setTimeout-10
console.log('script start');

setTimeout(function(){
  console.log('setTimeout-0');
}, 0)

setTimeout(function(){
  console.log('setTimeout-10');
}, 10)

setImmediate(() => {
  console.log('setImmediate');
})

new Promise((resolve,reject) => {
  console.log('Promise-new');
  resolve()
}).then(() => {
  console.log('promise-then');
})

process.nextTick(function(){
  console.log('process.nextTick');
})

console.log('script end');
script start
Promise-new
script end
process.nextTick
promise-then
setImmediate
setTimeout-0
setTimeout-10

process.nextTick其实并不是事件循环的一部分,但它的回调方法也是由事件循环调用的,该方法定义的回调方法会被加入到名为nextTickQueue的队列中。在事件循环的任何阶段,如果nextTickQueue不为空,都会在当前阶段操作结束后优先执行nextTickQueue中的回调函数,当nextTickQueue中的回调方法被执行完毕后,事件循环才会继续向下执行。

console.log('script start');

process.nextTick(function(){
  console.log('process.nextTick1');

  setTimeout(() => {
    console.log('nextTick-timeOut-10');
  },10)
})
setTimeout(function(){
  console.log('setTimeout-0');
}, 0)

setTimeout(function(){
  console.log('setTimeout-10');
}, 10)

setImmediate(() => {
  console.log('setImmediate');
})

new Promise((resolve,reject) => {
  console.log('Promise-new');
  resolve()
}).then(() => {
  console.log('promise-then');
})

process.nextTick(function(){
  console.log('process.nextTick2');
})

console.log('script end');
script start
Promise-new
script end
process.nextTick1
process.nextTick2
promise-then
setImmediate
setTimeout-0
setTimeout-10
nextTick-timeOut-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值