NodeJS事件循环执行顺序(process.nextTick and promise)

NodeJS eventloop execution order(process.nextTick and promise)

运行 下面的代码将得到:c,a,d,b

// case 1
const test = async () => {
  new Promise((resolve) => {
    resolve('a');
  }).then(r => console.log(r));

  process.nextTick(() => {
    console.log('c');
  });

  console.log(await 'd');

  return 'b';
};
(async () => {
  const r = await test();
  console.log(r);
})();

但是,如果我把 process.nextTick 放在 await 'd'

下面
// case 2
const test = async () => {
  new Promise((resolve) => {
    resolve('a');
  }).then(r => console.log(r));

  console.log(await 'd');

  process.nextTick(() => {
    console.log('c');
  });
  new Promise((resolve) => {
    resolve('e');
  }).then(r => console.log(r));

  return 'b';
};
(async () => {
  const r = await test();
  console.log(r);
})();

我得到:a,d,e,b,c

为什么process.nextTick的执行顺序会这样变化?

根据我有限的知识,nextTickPromise.resolve() 之前运行,如 case1 所示,所以我希望得到 a,d,c,e,b 而不是 a,d,e,b,c case2

免责声明

Node.js 绝对不保证 process.nextTick 和承诺回调的顺序。

我们 可能 在补丁版本中打破它,因为我们不认为它是 public API.

的一部分

可能不会依赖承诺的内部顺序和nextTick来做事。


这个特殊案例

这个特殊案例是 "bug" 我们处理 promises/callbacks 的方式。它最近已修复(在 semver 补丁中)——通过获取夜间版本的 Node,您将看到预期的执行顺序。