порядок выполнения кода ниже и почему? - PullRequest
0 голосов
/ 21 марта 2019

В основном порядок «обещание2» и «конец async1». Я не знаю почему.

async function async2() {
  console.log("async2");
}
new Promise(resolve => {
  resolve(async2());
}).then(() => {
  console.log("async1 end");
});

new Promise(function(resolve) {
  console.log("promise1");
  resolve();
}).then(function() {
  console.log("promise2");
});

1 Ответ

1 голос
/ 21 марта 2019
 resolve(async2());

вкратце совпадает с:

resolve(Promise.resolve())

Таким образом, он создает Обещание, которое разрешит, и передает его на разрешение другого Обещания. По мере того, как обещания сглаживаются (решение обещания с помощью обещания заставит внешнее обещание ждать внутреннего), ваши примеры могут быть упрощены до:

 Promise.resolve("first").then(console.log);

 Promise.resolve("second")
   .then(it => it) 
   .then(console.log);

Теперь разрешение Promise гарантированно будет асинхронным, поэтому даже если вы решите его синхронно, как в вашем случае, обратные вызовы .then будут вызываться только после 1 тика. Теперь первый из них будет регистрироваться после одного тика, второй также разрешится после одного тика, затем разрешится цепочка Promise, которая будет ждать другого тика до завершения третьего.

Таким образом, «обещание2» будет зарегистрировано после одного тика, а «конец async1» - после двух тиков.


Тем не менее, вы не должны полагаться на порядок выполнения обещаний.

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