process.nextTick 在 Promise.resolve().then 之前?

Byt*_*yte 5 javascript asynchronous event-loop node.js

下面的代码:

\n
process.nextTick( () => console.log("nextTick 1") );\nprocess.nextTick( () => { \n    console.log("nextTick 2"); \n    Promise.resolve("Resolved promise inside nextTick").then(console.log); \n})\n\nPromise.resolve("Resolved promise 1").then(console.log);\nPromise.reject("Rejected promise 2").catch(console.log);\n\nsetImmediate( () => {\n    console.log("setImmediate");\n    Promise.resolve("Resolved promise inside setImmediate").then(console.log);\n    Promise.reject("Rejected promise inside setImmediate").catch(console.log);\n    process.nextTick( () => console.log("nextTick 3") );\n})\n
Run Code Online (Sandbox Code Playgroud)\n

在节点 v14.17.0 中输出此内容

\n
Resolved promise 1\nRejected promise 2\nnextTick 1\nnextTick 2\nResolved promise inside nextTick    \nsetImmediate\nnextTick 3\nResolved promise inside setImmediate\nRejected promise inside setImmediate\n
Run Code Online (Sandbox Code Playgroud)\n

为什么前两个 Promise.then/catch 回调在 process.nextTick 回调之前调用?\xc2\xb4t process.nextTick 回调应该像 setImmediate 部分一样先于 Promise 回调吗?

\n

小智 0

重现此行为的最简单方法(节点 14+、16+、18):

package.json只需使用以下几行将新内容添加到同一文件夹:

{
  "type": "commonjs" //I assume you have here "module"
} 
Run Code Online (Sandbox Code Playgroud)

对于 commonJS,输出是预期的。

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