node事件循环(event loop)

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值