setImmediate 和 setIimeout
- setImmediate:当poll阶段完成后执行
- setTImeout(): 当时间达到后,有机会就执行
- 两者执行顺序区别
- 因被调用时上下文不同而不同
- 在非I/O循环(主模块)中,顺序不固定
- 在I/O循环中setImmdiate回调总是先执行
console.log('timeout');
},0);
setImmediate(function immediate () {
console.log('immediate');
});
fs.readFile(__filename, () => {
setTimeout(() => {
console.log('timeout')
}, 0)
setImmediate(() => {
console.log('immediate')
})
})
process.nextTick()
- nextTick会在eventloop继续执行前eventloop前,被调用
- nextTickQueue在处理完当前操作后,调用,而不管eventloop走到了哪个阶段
- 其他:为了防止轮询阶段持续时间太长,libuv 会根据操作系统的不同设置一个轮询的上限。
- nextTick和setTimeout
- nextTick()在eventloop当前阶段生效,即当前操作执行完,就执行nextTick。执行后,在继续evnetLoop
- setimmediat在poll阶段空闲时生效
- 允许处理错误,清理不需要的资源,或,在事件循环结束前再次尝试发送请求
- 让回调函数,在调用栈unwound(已清除)后,且事件循环继续前执行。
总结
- 尽量使用setImmediate()
- setTimeout() 在某个时间值后尽快执行函数
- setImmediate 一旦轮询阶段完成,执行回调函数
- process.nextTick() 在当前调用栈结束后立即处理
Node.js系列