Функция async
- это функция другого типа. ВСЕГДА возвращает обещание. В момент первого попадания await
выполнение функции приостанавливается, функция asyn c возвращает это обещание, и вызывающая сторона получает обещание и продолжает выполнять любой следующий код.
Кроме того функция async
автоматически упаковывает тело своей функции в try/catch
, так что любые исключения, будь то синхронные или необработанные отклоненные обещания из await
, автоматически перехватываются функцией async
и превращаются в отклонение от обещания, которое они автоматически return.
И, когда вы return
получаете значение из функции async
, это возвращаемое значение становится разрешенным значением обещания, которое оно возвращает.
Что я хочу Чтобы знать: почему это правило применяется? В чем проблема с простыми действиями ...
Функция async
имеет ряд поведений, которых нет у обычной функции, и интерпретатор JS хочет знать заранее, какие это тип функции, поэтому он может выполнять ее должным образом с правильным типом поведения.
Я полагаю, что интерпретатор мог обнаружить при компиляции тела функции, что он содержит await
и автоматически придает окружающей функции поведение async
, но это не очень декларативно, и простое добавление или удаление одного await
может изменить работу функции полностью. Здесь я только догадываюсь, но разработчики языка решили, что гораздо лучше принудительно объявить функцию async
таким образом, чем выводить ее поведение на основе содержимого тела функции.
Общая картина Здесь нужно понимать, что функция async
работает по-другому:
- Всегда возвращает обещание
- Автоматически перехватывает исключения или ожидает отклонения и превращает их в отклонения
- Приостановляет выполнение функции при ожидании
- Преобразует возвращаемое значение в разрешенное значение обещания, которое оно возвращает
- Цепочки явно возвращаемого обещания в асин c возвращенном обещании.
И, как таковой, язык более понятен и более декларативен, если это отдельное поведение прописано в объявлении с ключевым словом async
, а не выведено из тела функции.