async function
BaselineWidely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2017.
Объявлениеasync function
определяетасинхронную функцию, которая возвращает объектAsyncFunction
.
Вы также можете определить async-функции, используявыражение async function
.
Синтаксис
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 |