最近在学习 nodejs 的事件循环,提到了process.nextTick()
和Promise.then
优先级的问题,虽然一般来说前者优先级是高后面的,但执行情况可能会不一样
例如下面这段代码:
js
Promise.resolve().then(() => console.log("this is Promise.resolve 1"));
process.nextTick(() => console.log("this is process.nextTick 1"));
在CommonJS
模式输出是:
js
this is process.nextTick 1
this is Promise.resolve 1
但在module
模式输出是:
js
this is Promise.resolve 1
this is process.nextTick 1
这种差异的原因是nextTick
和Promise.then
不在同一个队列中,而在 module 模式下,为了可以支持全局 await,已经处于微任务阶段,会先执行先微任务队列。
同样可以使用Promise.then
来模拟:
js
function run() {
Promise.resolve().then(() => console.log("this is Promise.resolve 1"));
process.nextTick(() => console.log("this is process.nextTick 1"));
}
Promise.resolve().then(run);
上面代码无论什么格式下都会输出:
js
this is Promise.resolve 1
this is process.nextTick 1
所以测试 node 的任务队列,最好是放在 I/O 或者 setTimeout 回调中,在实际情况可以使用setImmediate
代替process.nextTick
,setImmediate
能保证执行位于Promise.then
回调