await

await 演算子は、async function によって Promise が返されるのを待機するために使用します。

構文

[rv] = await expression;
expression
解決を待つ Promise もしくは何らかの値。
rv

解決された promise の値。expression が Promise ではない場合はその値自体を返す。

説明

await 式は async function の実行を一時停止し、Promise の解決または拒否を待ちます。解決した後に async function の実行を再開します。再開するときに await 式は解決された Promise にラップされた値を返します。

Promise が拒否された場合、await 式は理由となった値を投げます。

await 式に続く値が Promise ではなかった場合、解決された Promise に変換されます。

await は実行フローを分割できるため、await の関数の呼び出し元は、await の関数の遅延継続の前に実行を再開できます。await がその関数の継続を延期した後、これが関数によって実行される最初の await でれば、await の関数の完了を求める保留中の Promise を関数の呼び出し元に返し、その呼び出し元の実行を再開することによって、即時実行も続行されます。

promise の解決を待つ

Promiseawait 式で停止された場合、Promise が解決されて、解決された値を返すのを待ちます。

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

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

f1();

Thenable オブジェクト

Thenable オブジェクトもまったく同じように実行されます。

async function f2() {
  const thenable = {
    then: function(resolve, _reject) {
      resolve('resolved!')
    }
  };
  console.log(await thenable); // resolved!
}

f2();

Promise への変換

値が Promise でない場合は、値を解決済みの Promise に変換して待ちます。

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

f3();

Promise の拒否

Promise が拒否された場合、拒否された値が投げられます。

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

f4();

拒否された Promise を処理する

拒否された Promisetry 文を使用せずにエラーハンドリングを行えます。

var response = await promisedFunction().catch((err) => { console.error(err); });
// response will be undefined if the promise is rejected

仕様

仕様書
ECMAScript (ECMA-262)
async functions の定義

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
awaitChrome 完全対応 55Edge 完全対応 14Firefox 完全対応 52IE 未対応 なしOpera 完全対応 42Safari 完全対応 10.1WebView Android 完全対応 55Chrome Android 完全対応 55Firefox Android 完全対応 52Opera Android 完全対応 42Safari iOS 完全対応 10.3Samsung Internet Android 完全対応 6.0nodejs 完全対応 7.6.0
完全対応 7.6.0
完全対応 7.0.0
無効
無効 From version 7.0.0: this feature is behind the --harmony runtime flag.

凡例

完全対応  
完全対応
未対応  
未対応
ユーザーが明示的にこの機能を有効にしなければなりません。
ユーザーが明示的にこの機能を有効にしなければなりません。

関連情報