JavaScript/for await...of
for await...of
編集for await...of は、JavaScript において非同期反復可能オブジェクト(AsyncIterable
)を反復処理するための制御文です。この構文を使用すると、非同期に値を生成するオブジェクト(例えば、非同期ジェネレーターや Promise
を含む配列)を簡潔に処理できます。
構文
編集for await (variable of asyncIterable) { // 実行するコード }
各部分の説明:
- variable: 各反復で解決された値を格納する変数。
- asyncIterable: 非同期反復可能なオブジェクト(
Symbol.asyncIterator
を実装したオブジェクト)。
使用例
編集非同期ジェネレーターを反復
編集// 非同期ジェネレーターの例 async function* asyncGenerator() { yield Promise.resolve(1); yield Promise.resolve(2); yield Promise.resolve(3); } for await (const value of asyncGenerator()) { console.log(value); // 1, 2, 3 が順に出力される }
この例では、非同期ジェネレーターの出力を順に処理しています。
// 配列内の Promise を反復 const promises = [ Promise.resolve('A'), Promise.resolve('B'), Promise.resolve('C') ]; for await (const value of promises) { console.log(value); // 'A', 'B', 'C' が順に出力される }
この例では、配列内の各 Promise
が解決され、その値が反復処理されます。
非同期処理の遅延出力
編集// 遅延を伴う非同期ジェネレーター async function* delayedGenerator() { for (let i = 1; i <= 3; i++) { await new Promise(resolve => setTimeout(resolve, 1000)); // 1秒待機 yield i; } } for await (const value of delayedGenerator()) { console.log(value); // 1秒ごとに 1, 2, 3 が順に出力される }
この例では、非同期ジェネレーターで遅延処理を行いながら値を出力しています。
注意点
編集for...of
との違い:for...of
は同期的に反復可能なオブジェクトに対して使用されますが、`for await...of` は非同期反復可能なオブジェクトに対して使用されます。- 非同期関数内でのみ使用可能: `for await...of` は
async
関数の中でのみ使用できます。 - エラー処理: 非同期操作でエラーが発生した場合、
try...catch
を使用してエラーを捕捉できます。
// エラー処理の例 async function processAsync() { try { for await (const value of asyncGenerator()) { console.log(value); } } catch (error) { console.error('エラーが発生しました:', error); } } processAsync();