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