es6 generator执行顺序

发布于 2022-09-12 13:08:53 字数 591 浏览 16 评论 0

教程例子如下:

function* dataConsumer() {
  console.log('Started');
  console.log(`1. ${yield}`);
  console.log(`2. ${yield}`);
  return 'result';
}

let genObj = dataConsumer();
genObj.next(); // Started
genObj.next('a') // 1. a
genObj.next('b') // 2. b

上面代码实际跑,效果相同。

我认为的效果是

let genObj = dataConsumer();
genObj.next(); // Started 1. undefined
genObj.next('a'); // 2. a

要执行到yield才算遍历器对象的next方法执行结束,所以第一次next会将前两条console.log都会跑完。由于第一次使用next方法,参数是无效的,yielld没定义值,所以呈现为undefined。

教程没详细解释整个流程,所以不清楚我思路错在哪里。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暗地喜欢 2022-09-19 13:08:53

yield 是生成器的暂停点,
yield 从外部带入的值是恢复执行的时候带入的。

第二个 console.log 还没执行到,执行权就跑出去了,所以第一次 next 是停在了第二个 log 的字符串求插值的地方。直到第二次 next 送进来一个 a ,才继续用 a 当值进行插值,得到参数调用 console.log.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文