setImmediate和process.nextTick都会在下一个 event loop 时执行,但是它们有如下区别:
setImmediate不会call stack,可以用于大规模异步递归调用。而process.nextTick受到 maxTickDepth(默认为1000) 的限制,超过其数值会出错。
setImmediate(handler) 并不像 setTimeout(handler, 0) 由event loop检测系统时间是否到点然后向事件队列插入一个事件,然后调用事件的回调方法handler。而是监控UI线程的调用栈,一旦调用栈为空则将handler压栈。
setImmediate可视为“排队等候的人”,而 process.nextTick 是“插队的人”,其区别可见下图:

其中“等待队列”可以是诸如A事件之前触发的 setTimeout 时间队列