AsyncGenerator.prototype.throw()

Baseline 已廣泛支援

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

throw() 方法用於 AsyncGenerator 例項,它的作用相當於在生成器當前暫停的位置插入一條 throw 語句,從而通知生成器發生錯誤,並允許生成器處理該錯誤、執行清理操作並關閉自身。

語法

js
asyncGeneratorInstance.throw(exception)

引數

exception

要丟擲的異常。為了方便除錯,最好將其設為 instanceof Error

返回值

如果丟擲的錯誤未被捕獲,它將返回一個 Promise,該 Promise 將以傳入的異常被拒絕。

如果異常被 try...catch 塊捕獲,並且生成器恢復以產生更多值,它將返回一個 Promise,該 Promise 將以一個具有兩個屬性的 Object 解析:

done

一個布林值。

  • 如果生成器函式的控制流已到達末尾,則為 true
  • 如果生成器函式能夠產生更多值,則為 false
value

從下一個 yield 表示式中產生的值。

示例

使用 throw()

以下示例展示了一個生成器以及如何使用 throw 方法丟擲一個錯誤。錯誤可以像往常一樣被 try...catch 塊捕獲。

js
// An async task. Pretend it's doing something more useful
// in practice.
function sleep(time) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, time);
  });
}

async function* createAsyncGenerator() {
  while (true) {
    try {
      await sleep(500);
      yield 42;
    } catch (e) {
      console.error(e);
    }
  }
}

const asyncGen = createAsyncGenerator();
asyncGen.next(1).then((res) => console.log(res)); // { value: 42, done: false }
asyncGen
  .throw(new Error("Something went wrong")) // Error: Something went wrong
  .then((res) => console.log(res)); // { value: 42, done: false }

規範

規範
ECMAScript® 2026 語言規範
# sec-asyncgenerator-prototype-throw

瀏覽器相容性

另見