Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.8k views
in Technique[技术] by (71.8m points)

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。

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...