AsyncGenerator
Baseline
広く利用可能
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2020年1月以降、すべてのブラウザーで利用可能です。
AsyncGenerator オブジェクトは非同期ジェネレーター関数から返されるもので、非同期反復可能プロトコルと非同期イテレータープロトコルの両方を満たすものです。
非同期ジェネレーターメソッドは、常に Promise オブジェクトを生成します。
AsyncGenerator は隠しクラスの AsyncIterator のサブクラスです。
コンストラクター
AsyncGenerator コンストラクターに対応する JavaScript のエンティティはありません。AsyncGenerator のインスタンスは、非同期ジェネレーター関数から返される必要があります。
async function* createAsyncGenerator() {
yield Promise.resolve(1);
yield await Promise.resolve(2);
yield 3;
}
const asyncGen = createAsyncGenerator();
asyncGen.next().then((res) => console.log(res.value)); // 1
asyncGen.next().then((res) => console.log(res.value)); // 2
asyncGen.next().then((res) => console.log(res.value)); // 3
非同期ジェネレーター関数によって作成されるすべてのオブジェクトに共通するプロトタイプオブジェクトという、隠れたオブジェクトが 1 つだけ存在します。このオブジェクトは、クラスのように AsyncGenerator.prototype と表記されることが多いですが、AsyncGeneratorFunction は実際の JavaScript エンティティであるため、より適切には AsyncGeneratorFunction.prototype.prototype と呼ぶべきです。AsyncGenerator インスタンスのプロトタイプチェーンを理解するには、AsyncGeneratorFunction.prototype.prototype を参照してください。
インスタンスプロパティ
これらのプロパティは AsyncGenerator.prototype で定義されており、すべての AsyncGenerator インスタンスで共有されています。
AsyncGenerator.prototype.constructor-
インスタンスオブジェクトを作成したコンストラクター関数。
AsyncGeneratorインスタンスの場合、初期値はAsyncGeneratorFunction.prototypeです。メモ:
AsyncGeneratorは生成した非同期ジェネレーター関数を格納しているわけではありません。 AsyncGenerator.prototype[Symbol.toStringTag]-
[Symbol.toStringTag]プロパティの初期値は、文字列"AsyncGenerator"です。このプロパティはObject.prototype.toString()で使用されます。
インスタンスメソッド
親である AsyncIterator からインスタンスメソッドを継承しています。
AsyncGenerator.prototype.next()AsyncGenerator.prototype.return()-
ジェネレータ本体に現在の停止位置に
return文を挿入したかのように動作します。try...finallyブロックと組み合わせるとジェネレーターを終了し、クリーンアップタスクを実行することができます。 AsyncGenerator.prototype.throw()-
ジェネレーター本体の現在の停止位置に
throw文が挿入されたかのように動作します。これは、ジェネレーターにエラー状態を通知し、エラーを処理するか、クリーンアップを実行して自身を終了させることができます。
例
>非同期ジェネレーターの反復処理
次の例では、非同期ジェネレーターを反復処理し、時間間隔が短くなるごとに 1~6 の値をコンソールに出力しています。時刻が変わるたびにプロミスが生成されますが、それは for await...of ループの中で自動的に解決されることに注意してください。
// 非同期タスクです。実際にはもっと有益なことを使用していることを
// 想定してください。
function delayedValue(time, value) {
return new Promise((resolve /*, reject */) => {
setTimeout(() => resolve(value), time);
});
}
async function* generate() {
yield delayedValue(2000, 1);
yield delayedValue(1000, 2);
yield delayedValue(500, 3);
yield delayedValue(250, 4);
yield delayedValue(125, 5);
yield delayedValue(50, 6);
console.log("All done!");
}
async function main() {
for await (const value of generate()) {
console.log("value", value);
}
}
main().catch((e) => console.error(e));
仕様書
| 仕様書 |
|---|
| ECMAScript® 2027 Language Specification> # sec-asyncgenerator-objects> |