Как это обещание работает в javascript - PullRequest
1 голос
/ 25 апреля 2020
Promise
.resolve()
.then(() => console.log(1))
.then(() => console.log(2))
.then(() => console.log(3));

Promise
.resolve()
.then(() => console.log(4))
.then(() => console.log(5))
.then(() => console.log(6));

Ответ: 1 4 2 5 3 6

Может кто-нибудь объяснить мне, как это работает?

Почему это не выполняется 1,2,3,4,5,6?

1 Ответ

2 голосов
/ 25 апреля 2020
Обратный вызов

A .then выполняется в микрозадаче, которая выполняется только после завершения синхронного кода, выполняемого в данный момент. Здесь синхронный код инициализирует два Обещания, которые разрешаются немедленно, с Promise.resolve.

Микрозадачи разрешаются по порядку, поэтому в конце сценария в очереди находятся две микрозадачи: первая, которая была помещена в очередь было () => console.log(1), так что сначала регистрируется. В этот момент Обещание 1 разрешено, поэтому следующий .then (2) был помещен в очередь для микропроцессора. Вторым, который был помещен в очередь, был () => console.log(4), так что он заносится в журнал вторым, а 5 помещается в очередь для микрозадач. Затем 2 запускается и помещает свой следующий .then в очередь (3), затем 4 запускается и помещает свой следующий .then (6) в очередь. Et c.

// queue:
[1, 4]
// 1 gets logged
// 2 gets pushed
[4, 2]
// 4 gets logged
// 5 gets pushed
[2, 5]
// 2 gets logged
// 3 gets pushed
[5, 3]
...

Если вы ожидали полного разрешения всей цепочки Обещания первого Обещания, прежде чем перейти ко второму Promise.resolve, все они будут работать в порядке, как вы ожидаете :

(async () => {
  await Promise
  .resolve()
  .then(() => console.log(1))
  .then(() => console.log(2))
  .then(() => console.log(3));

  await Promise
  .resolve()
  .then(() => console.log(4))
  .then(() => console.log(5))
  .then(() => console.log(6));
})();

Вышеуказанное происходит потому, что Обещание, созданное цепочкой обещаний .resolve().then( ...), разрешится только после того, как разрешится final Обещание в цепочке, то есть после регистрации 3.

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