【问题标题】:JavaScript ES6 Generator Catch Error Before Next MethodJavaScript ES6 生成器在下一个方法之前捕获错误
【发布时间】:2019-10-27 16:23:50
【问题描述】:

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

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

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());

【问题讨论】:

    标签: javascript generator


    【解决方案1】:

    当这条语句被执行时:

    const generator = makeGenerator();
    

    ...makeGenerator 函数体中的代码尚未执行,因此其try/catch 块尚未生效。只有当你执行generator.next()时,makeGenerator函数体中的代码才会开始执行,直到下一个yield。此时try/catch 块已生效。

    所以...如果您在第一个generator.next() 调用之前调用generator.throw() 之前,您将触发makeGenerator 代码未处理的异常。您的代码因未处理的异常而中断。因此,generator.throw()(在您的第二个代码版本中)之后没有任何内容被执行。

    【讨论】:

      【解决方案2】:

      通过生成器抛出错误的正确方法是将它们包装在 try...catch 中,因为如果没有捕获错误,您将在那里创建错误,然后,它会落入外部调用代码(如果有),并且,如果未被捕获,则终止脚本。

      function* makeGenerator() {
          try {
              yield 1;
              yield 1;
              yield 1;
          } catch (e) {
              console.log(e);
          }
      }
      
      const generator = makeGenerator();
      console.log(generator.next()); 
      try {
        generator.throw(new Error("WHOOPS"));
      } catch(e) {
        console.log(e); // shows the error
      }
      

      【讨论】:

        猜你喜欢
        • 2016-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        • 2015-09-21
        • 2018-03-23
        • 1970-01-01
        • 2020-11-03
        相关资源
        最近更新 更多