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

浏览器兼容性

另见