AsyncGenerator
AsyncGenerator 物件由一個 非同步生成器函式 返回,它符合 非同步可迭代協議和非同步迭代器協議。
非同步生成器函式總是會生成 Promise 物件。
AsyncGenerator 是隱藏的 AsyncIterator 類的子類。
建構函式
沒有 JavaScript 實體與 AsyncGenerator 建構函式相對應。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
只有一個隱藏物件,它是所有由非同步生成器函式建立的物件共享的原型物件。這個物件通常被風格化為 AsyncGenerator.prototype,使其看起來像一個類,但更恰當地說,它應該被稱為 AsyncGeneratorFunction.prototype.prototype,因為 AsyncGeneratorFunction 是一個實際的 JavaScript 實體。要理解 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 記錄到控制檯。請注意,每次生成一個 Promise,它都會在 for await...of 迴圈中自動解析。
// An async task. Pretend it's doing something more useful
// in practice.
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® 2026 語言規範 # sec-asyncgenerator-objects |
瀏覽器相容性
載入中…