代码之家  ›  专栏  ›  技术社区  ›  cody

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

  •  3
  • cody  · 技术社区  · 6 年前

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

    但是,如果我把过程。下一个复选框 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

    为什么选择流程。nextTick的执行顺序是这样变化的?

    根据我有限的知识, nextTick 之前运行 Promise.resolve() 如所示 case1 ,所以我希望 a,d,c,e,b 而不是 a、 d、e、b、c 在里面 case2

    1 回复  |  直到 6 年前
        1
  •  2
  •   Benjamin Gruenbaum    6 年前

    免责声明

    节点。js绝对不保证 process.nextTick 并承诺回电。

    我们 也许 在补丁版本中打破这一点,因为我们不认为它是公共API的一部分。

    可能不会 依靠承诺的内部秩序和 nextTick 为了做事。


    这个特殊情况

    这个特殊的案例有时是我们处理承诺/回访的“bug”。它最近得到了修复(在semver补丁中)-通过获取节点的夜间版本,您将看到预期的执行顺序。