コンテンツにスキップ

JavaScript/Symbol/asyncIterator

出典: フリー教科書『ウィキブックス(Wikibooks)』


Symbol.asyncIterator

[編集]

Symbol.asyncIterator は、JavaScriptで非同期反復可能オブジェクトを実装するために使用されるビルトインの Symbol です。このシンボルを使用することで、非同期処理を伴う反復操作を実現できます。非同期反復可能オブジェクトは、for await...of ループや非同期処理をサポートする構文で使用されます。

構文

[編集]

使用例

[編集]
const myAsyncIterable = {
  [Symbol.asyncIterator]() {
    let count = 0;
    return {
      async next() {
        if (count < 3) {
          return { value: count++, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

(async () => {
  for await (const value of myAsyncIterable) {
    console.log(value); // 0, 1, 2
  }
})();
  • [Symbol.asyncIterator]() メソッドは非同期反復可能オブジェクトで必須です。
  • メソッドは非同期反復子(AsyncIterator)オブジェクトを返します。
  • 非同期反復子オブジェクトは next() メソッドを持ち、Promiseで解決される { value: 任意の値, done: 真偽値 } を返します。

非同期反復可能オブジェクトの作成

[編集]

非同期データソースの例

[編集]

非同期データソースを処理する例です。

const fetchData = async (url) => {
  return new Promise((resolve) => {
    setTimeout(() => resolve(`Data from ${url}`), 1000);
  });
};

const asyncIterable = {
  [Symbol.asyncIterator]() {
    const urls = ['url1', 'url2', 'url3'];
    let index = 0;

    return {
      async next() {
        if (index < urls.length) {
          const value = await fetchData(urls[index++]);
          return { value, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

(async () => {
  for await (const data of asyncIterable) {
    console.log(data); // Data from url1, Data from url2, Data from url3
  }
})();

スプレッド構文との違い

[編集]

非同期反復可能オブジェクトはスプレッド構文で展開できません。for await...of などの非同期処理専用構文を使用します。

特徴

[編集]
  • 非同期専用: Symbol.asyncIterator は非同期処理を伴う反復に特化しています。
  • Promise対応: next() メソッドは常に Promise を返す必要があります。
  • 標準サポート: for await...of ループなどで標準的に利用可能です。

注意点

[編集]
  • 同期と非同期の違い: 同期用の Symbol.iterator と非同期用の Symbol.asyncIterator を混同しないよう注意してください。
  • Promise必須: 非同期反復子の next() メソッドは常に Promise を返さなければなりません。

関連項目

[編集]

参考

[編集]