我开始学习迭代器/生成器,有时我会看到一些奇怪的部分。目前我不明白为什么我的代码会这样工作。
下面的代码示例是我的主要代码。
function* makeGenerator() {
try {
yield 1;
yield 1;
yield 1;
} catch (e) {
console.log(e);
}
}
const generator = makeGenerator();
当我在抛出此代码之前使用下一个方法时,该代码可以正常工作。
console.log(generator.next()); // { done: false, value: 1 }
console.log(generator.throw("WTF?")); // "WTF"
console.log(generator.next()); // { done: true, value: undefined }
function* makeGenerator() {
try {
yield 1;
yield 1;
yield 1;
} catch (e) {
console.log(e);
}
}
const generator = makeGenerator();
console.log(generator.next()); // { done: false, value: 1 }
console.log(generator.throw("WTF?")); // "WTF"
console.log(generator.next()); // { done: true, value: undefined }
但是当我想在下一个方法之前使用 throw 方法时,我不明白为什么下一个方法不起作用?
console.log(generator.throw("WTF?")); // "WTF"
console.log(generator.next());
console.log(generator.next());
function* makeGenerator() {
try {
yield 1;
yield 1;
yield 1;
} catch (e) {
console.log(e);
}
}
const generator = makeGenerator();
console.log(generator.throw("WTF?")); // "WTF"
console.log(generator.next());
console.log(generator.next());
最佳答案
执行该语句时:
const generator = makeGenerator();
...makeGenerator 函数体中的代码尚未执行,因此其 try/catch
block 尚未生效。仅当执行generator.next()
时,makeGenerator
函数体中的代码才会开始执行,直到下一个yield
。此时,try/catch
block 生效。
所以...如果您在第一次 generator.next()
调用之前调用 generator.throw()
,您将触发一个makeGenerator 代码未处理的异常。您的代码因未处理的异常而中断。因此,generator.throw()
(在您的第二个代码版本中)之后的任何内容都不会被执行。
关于JavaScript ES6 生成器在下一个方法之前捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58581227/