NodeJS eventloop执行顺序(process.nextTick和promise)

时间:2018-05-06 11:52:24

标签: node.js promise async-await event-loop

以下运行代码将获得: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 1}}

1 个答案:

答案 0 :(得分:2)

声明

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

我们可能在修补程序版本中将其打破,因为我们不认为它是公共API的一部分。

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

这个特例

这个特例是一个" bug"我们有时如何处理承诺/回调。最近修复了(在semver-patch中) - 通过获取每晚版本的Node,您将看到预期的执行顺序。