JavaScript ES6 生成器在下一个方法之前捕获错误

标签 javascript generator

我开始学习迭代器/生成器,有时我会看到一些奇怪的部分。目前我不明白为什么我的代码会这样工作。

下面的代码示例是我的主要代码。

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/

相关文章:

javascript - 如何用另一个函数javascript停止计时器

javascript - jQuery动态添加图片到表格

python - 在 python 中创建生成器

python - 如何从python中的协程获取返回值

generator - 如何确定 Keras 中增强图像的数量?

python - 用于重构 for 循环和嵌套 if 语句组合的生成器

javascript - AWS Lambda 给出 "Process exited before completing request"

javascript - 如何设置D3的多力布局的勾选功能?

带有串联的 Javascript 循环输入文本框(动态)

ruby-on-rails - Ruby on Rails 生成模型字段 :type - what are the options for field:type?