以下代码:
process.nextTick( () => console.log("nextTick 1") );
process.nextTick( () => {
console.log("nextTick 2");
Promise.resolve("Resolved promise inside nextTick").then(console.log);
})
Promise.resolve("Resolved promise 1").then(console.log);
Promise.reject("Rejected promise 2").catch(console.log);
setImmediate( () => {
console.log("setImmediate");
Promise.resolve("Resolved promise inside setImmediate").then(console.log);
Promise.reject("Rejected promise inside setImmediate").catch(console.log);
process.nextTick( () => console.log("nextTick 3") );
})
在节点v14.17.0 中输出
Resolved promise 1
Rejected promise 2
nextTick 1
nextTick 2
Resolved promise inside nextTick
setImmediate
nextTick 3
Resolved promise inside setImmediate
Rejected promise inside setImmediate
为什么在process.nextTick回调之前调用前两个Promise.then/catch回调?不应该像setImmediate部分那样处理.nextTick回调之前的Promise回调吗?
复制此行为的最简单方法(节点14+、16+、18(:
只需以下几行即可将新的package.json
添加到同一文件夹:
{
"type": "commonjs" //I assume you have here "module"
}
对于commonJS,输出是预期的。
不幸的是,目前还没有一个很好的解释,更多的讨论在这里