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 を処理

編集
// 配列内の 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();

関連項目

編集

参考

編集