生成器函数传参数小记

Generator函数是可以传参数,一直用的不明不白的,今天写个例子,运行一下,记录一下过程,如下面这个小例子:

//简单的序列生成,主要看next传参数的时机
let test = {
	getId : function*(data){
		let id = 0,
			param=null;
		while(id < 4){
			console.log(`上一次param:${param}`);  //第一次输出 
			param = yield ((++id) + `,${data},${param}`);
			console.log(`更新后的param:${param}`);  //第二次输出
		}
	},
	data:["first","second","third","fourth","fifth"]
}
let go = test.getId("start"),
	pace = 0,
timer = setInterval(()=>{
	if (pace<6) {
		console.log(`pace: ${pace}`);
		console.log(go.next(test.data[pace]))
		pace++;
		console.log(`pace end;`);
	}else{
		clearInterval(timer)
	}
},2000);

再看看这个运行的结果,各位也可以自己运行一下:

生成器函数传参数小记_第1张图片

然后来写下结论,其实上面的图也就那三个框里是有用的:

1.  调用生成器函数后,生成器不会立即执行,仅仅生成一个迭代器而已,这个应该是大家都知道的了,例子中定时器是2s后才执行的,然后才输出了data参数值;

2.  第一次调用next,传入的参数是无效的,因为此时生成器内部还没有运行接受参数的一步,即yield操作还没有进行过,第一个值并没有产生,所以是无法接收next的参数的,这个很多地方也有说明了;

3.  从上一条结论可以看出,next里的参数,看上去更像是yield操作符的返回值,所以必须依赖产生过的yield,并且这个值是先于每次yield操作进行的,看每个pace后的"更新后"和"上一次param"值就可以看出来,"更新后param"在代码中是位于yield操作之后的,也就是每次next迭代器开始执行的地方,而此时值已经更新为当前next里的那个参数了,然后一直到再次遇到yield操作时,将这个值同其他参数一起交给了当前的yield处理,然后这个param就在等待下一次next调用的更新。

4.  而当next调用时,发现done已经为true,pace 4的时候,虽然param参数会更新,但是永远也不会再用到它了,这说明在不知道是否还有yield的时候,参数依然可以传入,只是最终用不到了。

以此记录一下,感觉 脑子终于清楚了。

 

工作累了吧,可以关注公众号,看看轻松的文章,放松一下。再忙,也该有自己的生活,一定要爱惜身体!

 

你可能感兴趣的:(js随笔,生成器函数,参数)