AsyncGenerator

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流瀏覽器均已支援。

AsyncGenerator 物件由一個 非同步生成器函式 返回,它符合 非同步可迭代協議和非同步迭代器協議

非同步生成器函式總是會生成 Promise 物件。

AsyncGenerator 是隱藏的 AsyncIterator 類的子類。

建構函式

沒有 JavaScript 實體與 AsyncGenerator 建構函式相對應。AsyncGenerator 例項必須由 非同步生成器函式 返回。

js
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()

返回一個 Promise,該 Promise 將在 yield 表示式產生的值處解析。

AsyncGenerator.prototype.return()

如同在生成器的當前暫停位置的體中插入了 return 語句一樣,它會完成生成器,並允許生成器在與 try...finally 塊結合使用時執行任何清理任務。

AsyncGenerator.prototype.throw()

如同在生成器的當前暫停位置的體中插入了 throw 語句一樣,它會通知生成器發生錯誤條件,並允許它處理錯誤,或執行清理並關閉自身。

示例

非同步生成器迭代

以下示例迭代一個非同步生成器,以遞減的時間間隔將值 1-6 記錄到控制檯。請注意,每次生成一個 Promise,它都會在 for await...of 迴圈中自動解析。

js
// 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

瀏覽器相容性

另見