nodejs事件循环机制

event loop

nodejs 事件循环机制

事件循环机制涉及的几个阶段

参考自 https://cnodejs.org/topic/57d68794cb6f605d360105bf

   ┌───────────────────────┐
┌─>│        timers         │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
│  │     I/O callbacks     │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
│  │     idle, prepare     │
│  └──────────┬────────────┘      ┌───────────────┐
│  ┌──────────┴────────────┐      │   incoming:   │
│  │         poll          │<─────┤  connections, │
│  └──────────┬────────────┘      │   data, etc.  │
│  ┌──────────┴────────────┐      └───────────────┘
│  │        check          │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
└──┤    close callbacks    │
   └───────────────────────┘
  • timers 阶段: 检查计时器如 setTimeout(callback)setInterval(callback) 的回调函数,如果到了执行的时间点就执行;
  • I/O callbacks 阶段: 执行其他回调函数。即除 close事件、定时器 和 setImmediate() 之外的回调函数;
  • idle, prepare 阶段: 仅node内部使用;
  • poll 阶段: 获取新的I/O事件;
  • check 阶段: 执行setImmediate() 设定的回调函数;
  • close callbacks 阶段: 比如socket.on(‘close’, callback)的callback会在这个阶段执行.

一个例子

参考自https://lynnelv.github.io/js-event-loop-nodejs

setTimeout(()=>{
    console.log('timer1')

    Promise.resolve().then(function() {
        console.log('promise1')
    })
}, 0)

setTimeout(()=>{
    console.log('timer2')

    Promise.resolve().then(function() {
        console.log('promise2')
    })
}, 0)

输出结果应该是

timer1
timer2
promise1
promise2

下面的动图展示了这一过程

<https://lynnelv.github.io/img/article/event-loop/node-excute-animate.gif>” /></p>
	</div><!-- .entry-content -->

	<footer class= 发布于 分类 JavaScript标签 于nodejs事件循环机制留下评论