javascript - Generator.prototype.throw() 是如何工作的?是否包含隐式的 next() ?

标签 javascript ecmascript-6

我正在学习Generator.prototype.throw(),并测试了下面的代码。

var generator = function* () {
  for(let i = 0; i < 10; i++) {
    try {
      var value = yield i;
      console.log(i);
    } catch(e) {
      console.log("catch exception...");
    }
  }
};

var g = generator();
g.throw();

在这种情况下,chrome v49 下会抛出错误,提示“Uncaught undefined...”。

但是,如果我们首先调用 g.next(),然后调用 g.throw(),它就会起作用。

var generator = function* () {
  for(let i = 0; i < 10; i++) {
    try {
      var value = yield i;
      console.log(i);
    } catch(e) {
      console.log("catch exception...");
    }
  }
};

var g = generator();
g.next(); // Object {value: 0, done: false}
g.throw(); // catch exception...
g.next();
// 1
// Object {value: 2, done: false}

与此同时,i 值已被跳过,就像 g.next() 也被执行一样。

这是怎么发生的?

最佳答案

next()throw() 都从离开的地方继续。在您的第一个示例中,这将位于第一行之前:

-> throw() for(let i = 0; i < 10; i++) {

因此错误未被捕获。在你的第二个例子中,这将在产量之后:

var value = yield i; -> throw()

由于错误被捕获,应用程序将继续到同一点。调用 next() 后,应用程序将从那里恢复。

关于javascript - Generator.prototype.throw() 是如何工作的?是否包含隐式的 next() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36446273/

相关文章:

javascript - 如何使用 BundleTransformer YuiJsMinifier 删除评论

javascript - 一个月后的今天与 momentjs

javascript - 函数组合 - 多次循环遍历数组以进行多次操作是否效率低下?

javascript - Mini-Max Sum - 使用 JavaScript 返回两个(或更多)间隔数字

javascript - 无法将 JSON 结果绑定(bind)到组件变量

javascript - ES6 : Accessing to class'es 'this' from inner local function

javascript - 将数据从 jQuery.ajax() 传递到 Angular Controller ?

javascript - 按顺序显示 Bootstrap 模式对话框

Javascript foreach 输入形式的名称和值

javascript - for..of 循环定义中 let 和 const 的用法