Symbol.asyncIterator
Baseline
広く利用可能
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2020年1月以降、すべてのブラウザーで利用可能です。
Symbol.asyncIterator は静的データプロパティで、ウェルノウンシンボルの Symbol.asyncIterator を表します。非同期反復可能プロトコルは、オブジェクトの非同期反復子を返すメソッドをこのシンボルで探します。オブジェクトが非同期反復可能であるためには、[Symbol.asyncIterator] キーを持つ必要があります。
試してみましょう
const delayedResponses = {
delays: [500, 1300, 3500],
wait(delay) {
return new Promise((resolve) => {
setTimeout(resolve, delay);
});
},
async *[Symbol.asyncIterator]() {
for (const delay of this.delays) {
await this.wait(delay);
yield `${delay} ミリ秒の遅延レスポンス`;
}
},
};
(async () => {
for await (const response of delayedResponses) {
console.log(response);
}
})();
// 予想される結果: "500 ミリ秒の遅延レスポンス"
// 予想される結果: "1300 ミリ秒の遅延レスポンス"
// 予想される結果: "3500 ミリ秒の遅延レスポンス"
値
ウェルノウンシンボル Symbol.asyncIterator です。
Symbol.asyncIterator のプロパティ属性 | |
|---|---|
| 書込可能 | 不可 |
| 列挙可能 | 不可 |
| 設定可能 | 不可 |
例
>ユーザー定義の非同期反復可能項目
オブジェクトに [Symbol.asyncIterator]() プロパティを設定することで、独自の非同期イテレーターを定義することができます。
js
const myAsyncIterable = {
async *[Symbol.asyncIterator]() {
yield "hello";
yield "async";
yield "iteration!";
},
};
(async () => {
for await (const x of myAsyncIterable) {
console.log(x);
}
})();
// 期待される出力:
// "hello"
// "async"
// "iteration!"
API を作成するとき、非同期反復可能項目はデータのストリームやリストのような、反復可能なものを表すために設計されたものであり、ほとんどの状況でコールバックやイベントを完全に置き換えるものではないことに注意してください。
組み込みの非同期反復可能オブジェクト
コア JavaScript 言語に非同期反復可能オブジェクトはありません。一部の Web API、例えば ReadableStream は既定で Symbol.asyncIterator メソッドが設定されています。
仕様書
| 仕様書 |
|---|
| ECMAScript® 2027 Language Specification> # sec-symbol.asynciterator> |