Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2020年1月以降、すべてのブラウザーで利用可能です。
for await...of 文は、非同期反復可能オブジェクトを、同期反復可能オブジェクトと同様に反復処理するループを作成します。この文は await が使用できるコンテキスト、例えば非同期関数の本体やモジュール内などでのみ使用できます。
一連の反復処理の各回において、値を受け取ります。const、let、var の何れかの宣言や、代入文のターゲットとなるもの (例:前回宣言された変数、オブジェクトのプロパティ、または構造分解パターン)を指定することができます。var をつけて宣言された変数は、ループ内のスコープではなく、つまり for await...of ループと同じスコープ内に存在します。
iterable非同期反復可能オブジェクトまたは同期反復可能オブジェクト。このループが処理する一連の値の元となるものです。
statement反復処理のたびに実行される文です。variable を参照することができます。ブロック文を使用して、複数の文を実行することができます。
for await...of ループが反復可能オブジェクトを反復処理する場合、最初に反復可能オブジェクトの [Symbol.asyncIterator]() メソッドを取得してそれを呼び出すと、非同期イテレーターが返されます。@asyncIterator メソッドが存在しない場合は、次に [Symbol.iterator]() メソッドを探し、同期イテレーターを返します。次に、 next()、return()、throw() メソッドから返されるすべてのオブジェクトを解決済みまたは拒否済みのプロミスにラップし、value プロパティがプロミスであれば解決済みにすることで、返された同期イテレーターを非同期イテレーターにラップします。ループは、最終的な非同期イテレーターの next() メソッドを繰り返し呼び出して、返されるプロミスを待ち、variable に代入される一連の値を生成します。
for await...of ループは、イテレーターが完了したとき(待機呼び出しした next() が done: true の入ったオブジェクトとを返したとき)に終了します。他のループ文のように、制御フロー文を statement の内部で使用することができます。
for await...of ループが早期に終了した場合(例えば、break 文に遭遇したり、エラーが throw された場合)、クリーンアップを実行するためにイテレーターの return() メソッドが呼び出されます。返されたプロミスは、ループが終了する前に待機されます。
for await...of は全般的に for...of ループと同様に機能し、構文や意味も共通しています。いくらか違いがあります。
for...of と同様、using 宣言を使用する場合、of という名前の変数を呼び出すことはできません。
これは using が導入される以前、有効なコードであった for await (using of []) との構文的なあいまいさを避けるためです。
非同期反復可能プロトコルを明示的に実装しているオブジェクトを反復処理することができます。
非同期の反復可能プロトコルを実装している非同期ジェネレーターであれば、 for await...of を使用して反復処理を行うことができます。
for await...of を使用して非同期ジェネレータを反復処理するより具体的な例として、API からのデータを反復処理することを考えてみましょう。
この例では、まずデータのストリームに対して非同期の反復可能オブジェクトを作成し、それを使用して API からのレスポンスの長さを計算します。
for await...of ループは同期の反復可能オブジェクトやジェネレーターで使用することもできます。この場合、内部的にはループの制御変数に代入する前に、値が出力されるのを待ちます。
メモ: 同期ジェネレーターから拒否されたプロミスが生み出される場合があることに注意してください。このような場合、for await...of は拒否されたプロミスを消費するので、ジェネレーター内の finally ブロックが呼び出されません。これは、確保したリソースを try/finally で解放する必要がある場合は望ましくない動作になる可能性があります。
同期ジェネレーター関数の finally ブロックが常に呼び出されるようにするには、非同期のジェネレーター関数の場合は for await...of を、同期ジェネレーター関数の場合は for...of を使用し、ループの中で生成されたプロミスを明示的に待つようにしてください。
| ECMAScript® 2027 Language Specification # sec-for-in-and-for-of-statements |
ブラウザー互換性一覧表を表示するには、JavaScript を有効にしてください。
より良いインターネットのための青写真。
このコンテンツの一部は、©1998–2026 個人の mozilla.org 協力者です。コンテンツはクリエイティブ・コモンズ・ライセンスのもとで利用できます。