这个系列的文章是我看阮一峰大神的《ES6标准入门》一书的总结,因为实在是有些复杂,所以整理一下加深一下理解,也排解一下寂寞.....
首先先上效果
然后搬运代码
function* hello() {
yield "hello";
yield "world";
return "ending";
}
var hw = hello();
console.log(hw.next());
console.log(hw.next());
console.log(hw.next());
console.log(hw.next());
代码很简单,只是按书中的代码稍加变化
首先上面定义的是一个generator函数,声明generator函数也很简单只需要在function后面加 * 就可以了。那么generator函数有什么特别之处呐:
- generator函数会返回一个遍历器
遍历器简单的说就是js中定义的典型对象,这种对象含有一个next方法,方法的返回值是一个含有 value,done 两个值的对象。
- generator函数提供了关键字yield使函数实现了分布执行的,每一个yield都可以视为一个断点,而next函数就是下一步按钮
这里我们可以大概了解到generator函数的主要亮点就是实现了函数的分步执行,还有一些细节的特性,大家感兴趣,可以去翻翻原书,这里就不细说了,估计很难用的上。
然后讲讲书中说的几个典型的应用
- 将原来回调函数中的逻辑,放到调用函数下方:
// 回调函数的写法
function fun1(val, callback) {
// do something
...
callback()
}
// generator
function* fun2(val) {
// do something
...
yield;
// 后面写原来的callback代码
// callback
}
var it = fun2()
// 先执行yield上面的逻辑
it.next()
// 执行callback 代码
it.next()
这种方法,我是不太喜欢,感觉还不如之前的回调的写法。没那么直白爽快的感觉,两次next()感觉像卡了一下那种感觉。
- 第二种方法是这样的
// generator
function* fun2(val) {
yield fun3();
// 后面写原来的callback代码
// callback
}
function fun3() {
// do something
...
it.next()
}
var it = fun2()
// 先执行yield上面的逻辑
it.next()
这种方法可以看作上面的变种,他将之前yield之前的逻辑放入了fun3中并在其中调用it.next(),这样在外面调用的时候就只用一次next就行了。但是这样也有一个很明显的问题,就是fun3必须对主函数中的it可见,在平时编码的时候,很有可能fun3并不能有调用时的上下文,这就很尴尬。