javascript - Generator.prototype.throw()的工作原理是什么?
PHPz
PHPz 2017-04-11 08:58:44
[JavaScript讨论组]

目前在看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();

这时候会抛出"Uncaught undefined..."异常,我的测试环境是chrome v49

然而,如果我先调用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()也被执行了一次。Generator.prototype.throw()到底做了什么工作?

PHPz
PHPz

学习是最好的投资!

全部回复(1)
天蓬老师

第一个情况没有调g.next()直接调用g.throw(),肯定是一个uncaught error。因为Generator函数是延迟的,不调用next是不会进入函数执行的。那么这里你直接g.throw(),抛出的异常没有在generator的try-catch语句中,所以就直接抛到函数外了。

第二种情况:
g.next():不解释
g.throw():首先,这句话进入函数体去执行代码,相当于在var value = yield i;后面抛了异常。所以跳过了console.log(i);,执行了console.log("catch exception...");。由于是在for语句中,又还没有遇到yield,所以进入了下一次循环(i = 1的循环)。直到遇到了yield i,终止generator函数的执行,返回{value: 1, done: false}。这里就是你说的“就好像g.next()也被执行了一次”
g.next():不解释

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号