This page was translated from English by the community.Learn more and join the MDN Web Docs community.
async function
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since апрель 2017 г..
Объявлениеasync function определяетасинхронную функцию, которая возвращает объектAsyncFunction.
Вы также можете определить async-функции, используявыражение async function.
In this article
Синтаксис
async function name([param[, param[, ... param]]]) { statements}nameИмя функции.
paramИмя аргумента, который будет передан в функцию.
statementsВыражение, содержащее тело функции.
Описание
После вызова функцияasync возвращаетPromise. Когда результат был получен,Promise завершается, возвращая полученное значение. Когда функцияasync выбрасывает исключение,Promise ответит отказом с выброшенным (throws) значением.
Функция async может содержать выражениеawait, которое приостанавливает выполнение функции async и ожидает ответа от переданногоPromise, затем возобновляя выполнение функцииasync и возвращая полученное значение.
Ключевое словоawait допустимо только в асинхронных функциях. В другом контексте вы получите ошибкуSyntaxError.
Примечание:Цель функций async/await упростить использование promises синхронно и воспроизвести некоторое действие над группойPromises. Точно так же какPromises подобны структурированным колбэкам, async/await подобна комбинации генераторов и promises.
Примеры
>Простой пример
function resolveAfter2Seconds(x) { return new Promise((resolve) => { setTimeout(() => { resolve(x); }, 2000); });}async function add1(x) { const a = await resolveAfter2Seconds(20); const b = await resolveAfter2Seconds(30); return x + a + b;}add1(10).then((v) => { console.log(v); // prints 60 after 4 seconds.});async function add2(x) { const a = resolveAfter2Seconds(20); const b = resolveAfter2Seconds(30); return x + (await a) + (await b);}add2(10).then((v) => { console.log(v); // prints 60 after 2 seconds.});Предупреждение:Не путайте await и Promise.allФункцияadd1 приостанавливается на 2 секунды для первогоawait и ещё на 2 для второго. Второй таймер создаётся только после срабатывания первого. В функцииadd2 создаются оба и оба же переходят в состояниеawait. В результате функцияadd2 завершится скорее через две, чем через четыре секунды, поскольку таймеры работают одновременно. Однако запускаются они всё же не параллельно, а друг за другом - такая конструкция не означает автоматического использованияPromise.all. Если два или более Promise должны разрешаться параллельно, следует использоватьPromise.all.
Когда функцияasync выбрасывает исключение
async function throwsValue() { throw new Error("oops");}throwsValue().then( (resolve) => { console.log("resolve:" + resolve); }, (reject) => { console.log("reject:" + reject); },);//prints "reject:Error: oops"//orthrowsValue() .then((resolve) => { console.log("resolve:" + resolve); }) .catch((reject) => { console.log("reject:" + reject); });//prints "reject:Error: oops"Перепись цепочки promise с использованием функцииasync
API, которое возвращаетPromise, будет возвращать значение в цепочке, тем самым разбивая функцию на много частей. Рассматривая следующий код:
function getProcessedData(url) { return downloadData(url) // returns a promise .catch((e) => { return downloadFallbackData(url); // returns a promise }) .then((v) => { return processDataInWorker(v); // returns a promise });}он может быть переписан с одним использованием функцииasync:
async function getProcessedData(url) { let v; try { v = await downloadData(url); } catch (e) { v = await downloadFallbackData(url); } return processDataInWorker(v);}Заметьте, что пример выше не содержитawait наreturn, потому что возвращаемое значение функцииasync неявно обёрнуто вPromise.resolve.
Спецификации
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-async-function-definitions> |