Порядок выполнения NodeJS eventloop (process.nextTick и обещание) - PullRequest
0 голосов
/ 06 мая 2018

Выполните код ниже, получите: 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 изменяется так?

Согласно моему ограниченному знанию, nextTick выполняется до Promise.resolve(), как показано в case1, поэтому я ожидал получить a,d,c,e,b вместо a,d,e,b,c в case2

1 Ответ

0 голосов
/ 06 мая 2018

Отказ

Node.js не дает абсолютно никаких гарантий порядка process.nextTick и обещает обратные вызовы.

Мы можем нарушить это в версии патча, поскольку мы не считаем его частью публичного API.

Вы не можете полагаться на внутренний порядок обещаний и nextTick s для выполнения действий.


Это частный случай

Этот конкретный случай был "ошибкой" в том, как мы иногда обрабатывали обещания / обратные вызовы. Это было недавно исправлено (в semver-patch) - получив ночную версию Node, вы увидите ожидаемый порядок выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...