JS Обещания: Почему ожидание должно быть внутри функции asyn c? - PullRequest
0 голосов
/ 02 мая 2020

Скажем, у меня есть следующий код:

new Promise(res => res(1))
.then(val => console.log(val))

Я могу добиться того же с помощью async/await, например:

let func = async () => {
  let val = await new Promise(res => res(1))
  console.log (val)
}
func()

Я поместил код async/await внутри функционировать только потому, что вы должны быть внутри асинхронной c функции, чтобы использовать await.

Что я хочу знать: Почему это правило применяется? В чем проблема с выполнением

let val = await new Promise(res => res(1))
console.log (val)

Является ли причина, по которой await вызывает текущую область, чтобы приостановить выполнение, и поэтому вы вынуждены поместить код async/await в специальную область асинхронности c функция не позволяет JS приостановить выполнение всего остального кода?

1 Ответ

1 голос
/ 02 мая 2020

Функция async - это функция другого типа. ВСЕГДА возвращает обещание. В момент первого попадания await выполнение функции приостанавливается, функция asyn c возвращает это обещание, и вызывающая сторона получает обещание и продолжает выполнять любой следующий код.

Кроме того функция async автоматически упаковывает тело своей функции в try/catch, так что любые исключения, будь то синхронные или необработанные отклоненные обещания из await, автоматически перехватываются функцией async и превращаются в отклонение от обещания, которое они автоматически return.

И, когда вы return получаете значение из функции async, это возвращаемое значение становится разрешенным значением обещания, которое оно возвращает.

Что я хочу Чтобы знать: почему это правило применяется? В чем проблема с простыми действиями ...

Функция async имеет ряд поведений, которых нет у обычной функции, и интерпретатор JS хочет знать заранее, какие это тип функции, поэтому он может выполнять ее должным образом с правильным типом поведения.

Я полагаю, что интерпретатор мог обнаружить при компиляции тела функции, что он содержит await и автоматически придает окружающей функции поведение async, но это не очень декларативно, и простое добавление или удаление одного await может изменить работу функции полностью. Здесь я только догадываюсь, но разработчики языка решили, что гораздо лучше принудительно объявить функцию async таким образом, чем выводить ее поведение на основе содержимого тела функции.

Общая картина Здесь нужно понимать, что функция async работает по-другому:

  1. Всегда возвращает обещание
  2. Автоматически перехватывает исключения или ожидает отклонения и превращает их в отклонения
  3. Приостановляет выполнение функции при ожидании
  4. Преобразует возвращаемое значение в разрешенное значение обещания, которое оно возвращает
  5. Цепочки явно возвращаемого обещания в асин c возвращенном обещании.

И, как таковой, язык более понятен и более декларативен, если это отдельное поведение прописано в объявлении с ключевым словом async, а не выведено из тела функции.

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