for await...of

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 (ECMA-262)
ECMAScript Language: The for-in, for-of, and for-await-of Statements の定義
現行の標準  

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
for await...ofChrome 完全対応 63Edge 完全対応 79Firefox 完全対応 57IE 未対応 なしOpera 完全対応 50Safari 完全対応 11WebView Android 完全対応 63Chrome Android 完全対応 63Firefox Android 完全対応 57Opera Android 完全対応 46Safari iOS 完全対応 11Samsung Internet Android 完全対応 8.0nodejs 完全対応 10.0.0
完全対応 10.0.0
未対応 8.10.0 — 10.0.0
無効
無効 From version 8.10.0 until version 10.0.0 (exclusive): this feature is behind the --harmony-async-iteration runtime flag.

凡例

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

関連情報