Node.js中nextTick、setTimeout、setImmediate的区别

xiaoxiao2021-02-28  69

setImmediate 和 setIimeout

setImmediate:当poll阶段完成后执行setTImeout(): 当时间达到后,有机会就执行两者执行顺序区别 因被调用时上下文不同而不同在非I/O循环(主模块)中,顺序不固定在I/O循环中setImmdiate回调总是先执行 代码:调用顺序不固定 // timeout_vs_immediate.jssetTimeout(function timeout () { console.log('timeout'); },0); setImmediate(function immediate () { console.log('immediate'); }); 代码:调用顺序固定 // timeout_vs_immediate.jsvar fs = require('fs') 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
转载请注明原文地址: https://www.6miu.com/read-46280.html

最新回复(0)