es6 generator执行顺序

教程例子如下:

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。

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

阅读 1.6k
1 个回答

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题