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调用的情况。