JavaScript/Async Iterable Interface

カテゴリ:Book:JavaScript#Async%20Iterable%20Interface%20

Async Iterable Interface は、オブジェクトが非同期反復可能であることを示すインターフェースです。このインターフェースを実装するオブジェクトは、for await...of ループなどの非同期イテレーション操作で使用できます[1]

構文

[Symbol.asyncIterator]() { /* ... */ }
  • [Symbol.asyncIterator]: 非同期イテレータオブジェクトを返すメソッド。

非同期反復可能オブジェクトを作成するプログラム

以下のプログラムは、Async Iterable インターフェースを実装して非同期反復可能なオブジェクトを作成します。

const asyncIterableObj = {
  data: [1, 2, 3, 4, 5],
  [Symbol.asyncIterator]() {
    let index = 0;
    return {
      next: async () => {
        await new Promise(resolve => setTimeout(resolve, 1000));
        if (index < this.data.length) {
          return { value: this.data[index++], done: false };
        } else {
          return { done: true };
        }
      }
    };
  }
};

(async function() {
  for await (const value of asyncIterableObj) {
    console.log(value); // 1, 2, 3, 4, 5 (1秒間隔で出力)
  }
})();

このプログラムでは、Symbol.asyncIterator メソッドを実装して非同期反復可能なオブジェクトを作成しています。for await...of ループを使用してオブジェクトを非同期に反復処理することができます。

非同期ジェネレータを使用するプログラム

以下のプログラムは、非同期ジェネレータを使用して非同期反復可能オブジェクトを作成します。

async function* createAsyncGenerator() {
  for (let i = 1; i <= 5; i++) {
    await new Promise(resolve => setTimeout(resolve, 1000));
    yield i;
  }
}

(async function() {
  const asyncGen = createAsyncGenerator();
  for await (const value of asyncGen) {
    console.log(value); // 1, 2, 3, 4, 5 (1秒間隔で出力)
  }
})();

このプログラムでは、async function* を使用して非同期ジェネレータを作成しています。非同期ジェネレータはAsync Iterableインターフェースを自動的に実装しているため、for await...ofループで反復処理できます。

注意点

  • 非同期反復: for await...ofループは非同期反復可能オブジェクトを反復処理するために使用します。
  • 同期と非同期の違い: 通常のイテレータは{ value, done }オブジェクトを返しますが、非同期イテレータはこのオブジェクトを解決するPromiseを返します。
  • 両方のインターフェース: オブジェクトはSymbol.iteratorSymbol.asyncIteratorの両方を実装することができ、同期と非同期の両方の反復をサポートできます。
  • 非同期ジェネレータ: async function*Symbol.asyncIteratorメソッドを自動的に実装した非同期反復可能オブジェクトを作成します。

脚註

  1. これは、非同期データソースの要素を反復処理するために使用されます。

外部リンク

カテゴリ:Book:JavaScript#Async%20Iterable%20Interface%20 カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension