setTimeout
、setImmediate
和 process.nextTick
在 nodejs
的使用中,为了不阻塞程序的运行,经常会使用到定时器,将任务在当前事件的循环末尾或者下个事件循环的开始执行。
setTimeout
的使用形式一般是 setTimeout(fn,0)
,当然我们知道 浏览器端setTimeout
最小时间间隔是不得低于4毫秒,它的执行时机是在下一个事件循环的开始。
setImmediate和
setTimeout执行顺序是不确定的。 如果两者都在主模块中调用,那么执行先后取决于进程性能,也就是随机。 如果两者都不在主模块调用(被一个异步操作包裹),那么
setImmediate的回调永远先执行。
process.nextTick和
Promise` 都属于微任务,它们会在所属的事件循环最后,并在进入下一个事件循环之前执行。
在具体实现上,process.nextTick()的回调函数保存在一个数组中,
setImmediate()
的结果则是保存在链表中。
在行为上,process.nextTick() 在每轮循环中会将数组中的回调函数全部执行完,而setImmediate()
在每轮循环中执行链表中的一个回调函数。
这样设计的原因是为了保证每轮循环都能较快的执行结束,防止CPU
占用过多而阻塞后续I/O
调用的情况。