for await...of 文は非同期(と同期)の反復オブジェクトを繰り返して処理するループを作ります。対象の反復オブジェクトは、ビルトインの StringArray、配列様オブジェクト( argumentsNodeList 等)、TypedArrayMapSet、さらに、ユーザーが定義した非同期・同期の反復オブジェクトが含まれます。オブジェクトの各プロパティの値に対して実行されるステートメントを使用してカスタム反復フックを呼び出します。

構文

for await (variable of iterable) {
  statement
}
variable
反復ごとに、異なるプロパティの値が variable に割り当てられます。
iterable
反復可能プロパティが反復処理されるオブジェクトです。

非同期反復オブジェクトを繰り返し処理する

非同期反復可能プロトコルを明示的に実装しているオブジェクトを反復処理することができます:

var asyncIterable = {
  [Symbol.asyncIterator]() {
    return {
      i: 0,
      next() {
        if (this.i < 3) {
          return Promise.resolve({ value: this.i++, done: false });
        }

        return Promise.resolve({ done: true });
      }
    };
  }
};

(async function() {
   for await (num of asyncIterable) {
     console.log(num);
   }
})();

// 0
// 1
// 2

非同期ジェネレータを繰り返し処理する

非同期反復可能プロトコルを実装している async generator であれば、for await...of を使用して繰り返し処理できます:

async function* asyncGenerator() {
  var i = 0;
  while (i < 3) {
    yield i++;
  }
}

(async function() {
  for await (num of asyncGenerator()) {
    console.log(num);
  }
})();
// 0
// 1
// 2

仕様

仕様書 策定状況 コメント
ECMAScript Latest Draft (ECMA-262)
ECMAScript Language: The for-in, for-of, and for-await-of Statements の定義
ドラフト  

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
for await...of
実験的
Chrome 完全対応 63Edge 未対応 なしFirefox 完全対応 57IE 未対応 なしOpera 完全対応 50Safari 完全対応 11WebView Android 完全対応 63Chrome Android 完全対応 63Edge Mobile 未対応 なしFirefox Android ? Opera Android 完全対応 46Safari iOS ? Samsung Internet Android ? nodejs ?

凡例

完全対応  
完全対応
未対応  
未対応
実装状況不明  
実装状況不明
実験的。動作が変更される可能性があります。
実験的。動作が変更される可能性があります。

関連情報

ドキュメントのタグと貢献者

このページの貢献者: mdnwebdocs-bot, YuichiNukiyama, segayuu
最終更新者: mdnwebdocs-bot,