JavaScript: Будет ли код в асинхронных функциях до первого ожидаемого обещания выполняться синхронно? - PullRequest
0 голосов
/ 03 апреля 2019

С учетом следующего:

function defer(delay) {
  return new Promise((resolve) => setTimeout(resolve, delay));
}

let a;
(async () => {
  a = 1;
  await defer(1000);
  a = 2;
})();
console.log(a); // 1

Есть ли у меня гарантия на все двигатели и транспиляции, что значение a после вызова асинхронной функции равно 1 и не определено?Другими словами, выполняется ли синхронно выполнение кода перед первым оператором ожидания?

1 Ответ

2 голосов
/ 03 апреля 2019

Другими словами, является ли код перед первым оператором ожидания выполненным синхронно?

Да.

Это указано в 25.7.5.1 спецификации:

25.7.5.1 AsyncFunctionStart (обещание емкости, asyncFunctionBody)

[логика возобновления выполнения когда-либо]

  1. Вставить asyncContext в стек контекста выполнения; asyncContext теперь является запущенным контекстом выполнения.

  2. Возобновить приостановленную оценку asyncContext. Пусть результат будет значением, возвращаемым возобновленным вычисление.

  3. Утверждение: когда мы вернемся сюда, asyncContext уже был удален из стека контекста выполнения и runningContext - это текущий запущенный контекст выполнения.

  4. Утверждение: результат - нормальное завершение со значением undefined. Возможные источники значений завершения Ожидайте или, если асинхронная функция ничего не ждет, шаг 3.g выше.

Эта операция запускается при вызове асинхронной функции, и, как вы можете видеть, она непосредственно выполняет asyncContext , ничего не ожидая. Однако, если двигатель достигает значения await, он активно останавливает выполнение:

6.2.3.1 Ожидают

[настроить логику, чтобы продолжить когда-нибудь]

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