await

Оператор await використовується для очікування на проміс. Він може використовуватись лише всередині асинхронної функції.

Синтаксис

[rv] = await expression;
expression
Проміс чи будь-яке інше значення, якого треба дочекатись.
rv

Повертає значення виконаного проміса, або саме значення, якщо це не об'єкт Promise.

Опис

Вираз await спричиняє призупинення виконання асинхронної функції до встановлення об'єкта Promise (проміс) (тобто, до його вирішення або відхилення), а також відновлює виконання асинхронної функції після його завершення. Після відновлення, значенням виразу await є значення виконаного проміса.

Якщо проміс відхилено, вираз await викидає значення відхилення.

Якщо значення виразу, що стоїть після оператора await, не є об'єктом Promise, воно перетворюється на вирішений проміс.

Оператор await може розбивати хід виконання, дозволяючи коду, що викликав функцію з await, відновити виконання ще до того, як буде продовжене відкладене виконання функції з await. Після того, як await відкладає продовження своєї функції, якщо це перший оператор await, що виконується функцією, негайне виконання також продовжується поверненням у код, що викликав функцію, проміса у стані очікування для завершення виконання функції з await та для відновлення виконання коду, що її викликав.

Приклади

Якщо у вираз await був переданий проміс, то вираз чекає на виконання проміса та повертає значення, що є результатом виконання.

function resolveAfter2Seconds(x) { 
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

async function f1() {
  var x = await resolveAfter2Seconds(10);
  console.log(x); // 10
}

f1();

Промісоподібні об'єкти виконуватимуться так само.

async function f2() {
  const thenable = {
    then: function(resolve, _reject) {
      resolve('вирішений!')
    }
  };
  console.log(await thenable); // вирішений!
}

f2();

Якщо значенням є не проміс, він перетворює його на вирішений проміс та чекає на нього.

async function f3() {
  var y = await 20;
  console.log(y); // 20
}

f3();

Якщо проміс відхилено, викидається значення відхилення.

async function f4() {
  try {
    var z = await Promise.reject(30);
  } catch(e) {
    console.log(e); // 30
  }
}

f4();

Обробити відхилений проміс без блока try.

var response = await promisedFunction().catch((err) => { console.log(err); });
// якщо проміс відхилено, значенням response буде undefined

Специфікації

Специфікація
ECMAScript (ECMA-262)
The definition of 'async functions' in that specification.

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
awaitChrome Full support 55Edge Full support 14Firefox Full support 52IE No support NoOpera Full support 42Safari Full support 10.1WebView Android Full support 55Chrome Android Full support 55Firefox Android Full support 52Opera Android Full support 42Safari iOS Full support 10.3Samsung Internet Android Full support 6.0nodejs Full support 7.6.0
Full support 7.6.0
Full support 7.0.0
Disabled
Disabled From version 7.0.0: this feature is behind the --harmony runtime flag.

Legend

Full support  
Full support
No support  
No support
User must explicitly enable this feature.
User must explicitly enable this feature.

Див. також