Событие L oop и обещания - PullRequest
3 голосов
/ 26 мая 2020

Когда я запускаю код ниже в консоли, я получаю вывод как:

"start"
"Promise 2"
"end"
"Promise 1"

console.log("start");
Promise.resolve().then(
  () => console.log("Promise 1")
).then(console.log("Promise 2"));
console.log("end");

Кто-нибудь может мне объяснить, почему «Promise 2» печатается перед «Promise 1» и «end»?

Ответы [ 2 ]

4 голосов
/ 26 мая 2020

Аргумент .then() должен быть функцией. Но вы написали .then(console.log("Promise 2")), а console.log("Promise 2") - это вызов функции, а не функция. Он выполняется немедленно, поэтому сообщение журнала отображается сразу же, а не после выполнения обещания.

Измените его на функцию, как у вас около console.log("Promise 1"), и они будут выполнены в ожидаемом порядке.

console.log("start");
Promise.resolve().then(
  () => console.log("Promise 1")
).then(() => console.log("Promise 2"));
console.log("end");

end регистрируется первым, потому что разрешение обещаний является асинхронным.

0 голосов
/ 26 мая 2020

Как уже указывалось, вы должны передать console.log как функцию, чтобы она работала в правильном порядке.

Что касается причины, по которой end отображается первым, это связано с тем, что событие l oop гарантирует, что стек вызовов пуст и все глобальные выполнения завершены, прежде чем оно проверяет очередь микрозадач (иногда называется очередью заданий), где журналы вашей консоли ожидают добавления в стек вызовов.

Речь идет о приоритетах (в порядке убывания приоритета):

  • Глобальный поток выполнения
  • Очередь микрозадач / заданий
  • Очередь задач

start и end находятся в глобальном потоке выполнения, поэтому они будут выполняться первыми. Событие l oop добавит журналы Promise 1 и Promise 2 из очереди микро-задач и запустит их после завершения всех глобальных выполнений. Наконец, если очередь микрозадач пуста, событие l oop проверит очередь задач (сюда добавляются такие вещи, как setTimeout).

Надеюсь, что это поможет.

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