async
функции
Асинхронная функция возвращает обещание, которое разрешается значением, возвращаемым телом функции, или отклоняется ошибкой, выданной в теле.
Оператор await
возвращает значение выполненного обещания или выдает ошибку, используя причину отклонения, если ожидаемое обещание отклонено.
Ошибки, выданные await
, могут быть перехвачены блоками try-catch внутри функции async
, вместо того, чтобы позволить им распространяться вверх по стеку выполнения и отклонить обещание, возвращаемое вызовом функции async
.
Оператор await
также сохраняет контекст выполнения перед возвратом в цикл событий, чтобы разрешить выполнение операций обещания.При внутреннем уведомлении об урегулировании ожидаемого обещания он восстанавливает контекст выполнения перед продолжением. Блок
try/catch
, установленный в контексте выполнения функции async
, не изменяется и не становится неэффективным просто потому, что контекст имеетбыл сохранен и восстановлен await
.
As aside
"async-await реализован с использованием генераторов, обещаний и сопрограмм"
может быть частью того, как Babel переносит использование async
функции и await
оператора, но нативные реализации могут быть реализованы более напрямую.
Функции генератора (обновление)
Контекст выполнения функции генератора сохраняется во внутреннем слоте [[Generator Context]] связанного с ним объекта генератора.( ECMA 2015 25.3.2 )
Выражения выхода удаляют контекст выполнения генератора из верхней части стека контекста выполнения ( 25.3.3.5 из ES6 / ECMAScript 2015 )
Возобновление функции генератора восстанавливает контекст выполнения функции из слота [[Generator Context]] объекта генератора.
Следовательно, функции генератора эффективно восстанавливают предыдущий контекст выполнения, когда возвращается выражение yield
.
Выдача ошибки в функции генератора по обычным причинам (синтаксическая ошибка, оператор throw
, вызов функции, которая выдает) может быть перехвачена блоком try-catch, как и ожидалось.
Выдача ошибки с помощью Generator.prototype.throw()
выдает ошибку в функции генератора, происходящую из yield expression
, который в последний раз передал управление от функции генератора.Эта ошибка может быть зафиксирована на try-catch
, как и для обычных ошибок.(Ссылка на MDN с использованием throw () , ECMA 2015 25.3.3.4
Сводка
Try-catch блоки вокруг yield
операторов, используемых в await
кодах транспорта, работают по той же причине, что и для await
операторов в собственных async
функциях - они определены в том же контексте выполнения, что и ошибка, выдаваемая для отклоненного обещания.