JavaScript/Symbol/asyncIterator
< JavaScript | Symbol
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 を返さなければなりません。