process.nextTick before Promise.resolve().then?



以下代码:

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,输出是预期的。

不幸的是,目前还没有一个很好的解释,更多的讨论在这里

最新更新