javascript "ждет" немедленно приостановки, что бы он ни делал, и возобновляет функцию asyn c после выполнения обещания? - PullRequest
1 голос
/ 26 марта 2020

Я только начал изучать asyn c -wait и просто хочу четко знать ход выполнения программы.

async function A() {
 await doSomethingAsync();
 doThisNext();
}

A();
B();
C();

Учитывая, что приведенный выше фрагмент кода, скажем, B () выполняется в данный момент .

  1. Пока B () выполняется и если doSomethingAsyn c () будет решена в этот момент, выполнение программирования временно приостановит B (), чтобы возобновить A () (т.е. ; запустить doThisNext (), а затем переключиться обратно?

  2. Или B () (или даже C ()) сначала завершится, а затем выполнит doThisNext ()?

  3. Или я неправильно все понимаю?

Предположим, что B и C являются просто обобщенными c функциями без асинхронного c кода.

1 Ответ

6 голосов
/ 26 марта 2020

Во время выполнения B () и, если doSomethingAsyn c () будет разрешено в этот момент, выполнение программирования временно приостанавливает B () для возобновления A () (т. Е. Запускает doThisNext (), а затем переключиться обратно?

Это не то, как работает событие l oop. Если B синхронно, оно не будет прервано разрешением обещания. Что планируется выполнить во время текущей микро-очереди разрешения обещания .

Итак, порядок будет

  1. A начат и приостановлен
  2. B закончен
  3. C закончен
  4. Возобновление и окончание

A();
B();
C();



async function A() {
  console.log('A start');
  await delay(0);
  // or even
  // await Promise.resolve('done')
  console.log('A end')
}

function B() {
  console.log('B')
}

function C() {
  console.log('C')
}

function delay(ms) {
  return new Promise(r => setTimeout(r, ms))
}
...