TypeError: already executing generator

generator 在执行其自身的 generator 函数体时,却通过其某个方法(例如 next())继续执行时,就会发生 JavaScript 异常“TypeError: generator 正在执行中”。

消息

TypeError: Generator is already running (V8-based)
TypeError: already executing generator (Firefox)
TypeError: Generator is executing (Safari)

错误类型

TypeError

哪里出错了?

generator 的方法,next()return()throw(),旨在当 generator 函数在 yield 表达式之后或在第一个语句之前暂停时,继续执行该函数。如果在执行 generator 函数时调用其中一个方法,就会抛出此错误。如果你想在 generator 函数中返回或抛出,请分别使用 return 语句或 throw 语句。

示例

js
let it;
function* getNumbers(times) {
  if (times <= 0) {
    it.throw(new Error("times must be greater than 0"));
  }
  for (let i = 0; i < times; i++) {
    yield i;
  }
}
it = getNumbers(3);
it.next();
js
let it;
function* getNumbers(times) {
  if (times <= 0) {
    throw new Error("times must be greater than 0");
  }
  for (let i = 0; i < times; i++) {
    yield i;
  }
}
it = getNumbers(3);
it.next(); // { value: 0, done: false }

另见