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。执行后,在继续evnetLoopsetimmediat在poll阶段空闲时生效
使用nextTick的主要原因:
允许处理错误,清理不需要的资源,或,在事件循环结束前再次尝试发送请求让回调函数,在调用栈unwound(已清除)后,且事件循环继续前执行。
总结
尽量使用setImmediate()setTimeout() 在某个时间值后尽快执行函数setImmediate 一旦轮询阶段完成,执行回调函数process.nextTick() 在当前调用栈结束后立即处理
Node.js系列
Node.js简介深入理解nodejs Event loop