Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

Эта страница была переведена с английского языка силами сообщества. Вы тоже можете внести свой вклад, присоединившись к русскоязычному сообществу MDN Web Docs.

async function

BaselineWidely available

Объявление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.

Примеры

Простой пример

js
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 выбрасывает исключение

js
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, будет возвращать значение в цепочке, тем самым разбивая функцию на много частей. Рассматривая следующий код:

js
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:

js
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

Совместимость с браузерами

Смотрите также

Help improve MDN

Learn how to contribute.

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp