(昨天晚上喝多了没更新,6瓶雪花淡爽,我就醉了~~)
今儿个学习下ES6 的生成器 Generator,这玩艺的名字挺唬人的,我刚一看的时候还以为能for循环似的批量生成函数了呢。。
结果细一看根本不是这么回事
先说下用途,它是用来搞定异步编程的编写方式的,以前都是嵌套式的,用了它就可以搞成顺序着写的了。
但,就像我以前说过的,其实就是换了个写法。
当然这是我个人的偏见,我的见识有限导致我目前这样认为。
来看看代码哈,先说现在的写法:
function fn1(a,b){
var aa = a+b;
console.log(aa);
var bb = a*b;
console.log(bb);
var cc = a-b;
console.log(cc);
}
调用后,以下输出
fn1(4,2);
//6
//8
//2
注意,6,8,2是一次输出的喔。
说到这里,我们要强调一下,函数这个东西,只有“调用”或“未被调用”的二种情况。没有某个函数“用了一半”的情况,函数不带刹车的。
这个时候吧,Generator,就出场了。
怎么用呢,
看代码,改成这样:
var fn1 = function* (a,b){
var aa = a+b;
yield console.log(aa);
var bb = a*b;
yield console.log(bb);
var cc = a-b;
yield console.log(cc);
}
加个星号,再加个yield就行,它就是Generator对象了,这个对象具有一个next方法,怎么用接着往下看。
然后执行下:
var gg = fn1(4,2);
gg.next();//6
然后这个函数就停止执行了,踩了刹车了。
gg.next();//8
然后这个函数就停止执行了,踩了刹车了。
gg.next();//2
然后整个函数执行完了。
到这里,相信读者同学已经看出Generator有啥用了。它要发挥作用,最好是和yield一起用。
yield官方定义是切割逻辑,其实我看它就是暂停键。
Generator的next属性就是油门,一调用它就继续执行了。
Generator和yield一起用,就是把一整个函数给切割成了几个部份了,然后这几个部份还共用使用一个this。
其实一个大函数里放几个小函数,形成一个大闭包,然后分别调用也能达到Generator、yield、next的效果。
但在代码量上,大闭包的代码量和结构,就比较“感人”了。就没有Generator这么舒爽了。
它在解决异步调用方面的比较有用,例如nodeJs的各个调用场景。
目前各个浏览器它的支持还是比较有限,但对于这种新技术还是要保持适当的跟踪和关注。