提前终止生成器
使用 return
提前终止生成器
所有的生成器对象都有 return()
方法,只要通过它进入关闭状态,就无法恢复。后续调用 next()
方法都会显示 done:true
状态。
ts
function* generatorFn() {
yield* [1, 2, 3];
}
const generator = generatorFn();
console.log(generator.next()); // { value: 1, done: false }
generator.return();
console.log(generator.next()); // { value: undefined, done: true }
使用 throw
提前终止生成器
throw()
方法会在暂停的时候将一个错误注入到生成器对象中,如果生成器对象没有捕获这个错误,就会提前终止。
ts
function* generatorFn2() {
yield* [1, 2, 3];
}
const generator2 = generatorFn2();
try {
generator2.throw("An error occurred");
} catch (error) {
console.log(error); // An error occurred
}
console.log(generator2.next()); // { value: undefined, done: true }
如果生成器内部捕获了错误,生成器就不会关闭,还可以恢复执行。错误处理会跳过对应的 yield
语句。
ts
function* generatorFn3() {
for (const x of [1, 2, 3]) {
try {
yield x;
} catch (error) {
console.log(error);
}
}
}
const generator3 = generatorFn3();
console.log(generator3.next().value); // 1
generator3.throw("An error occurred");
console.log(generator3.next().value); // 3