Generator函数
生成器函数作为ES6的新特性之一,已经并不是什么新鲜的概念了。在此之前,Python,Php等均有生成器的概念。其本质就是一个返回iterator的函数,通过yield关键字可以暂停函数的执行,并在下一次调用相关方法时继续函数的执行。
基本用法
1 | function* letterGenerator() { |
可以看到通过调用生成器函数,我们得到了一个iterator对象。iterator对象包含next方法,可用于迭代iterable类型的数据。通过调用iterator的next方法,我们得到一个包含两个属性value和done的对象,用于标识我们的迭代过程,这也是generator函数最基本的用法。
控制权传递
1 | function* controlTransfer() { |
和上面类似,只不过新增了yield*
语法,通过这种方式,我们可以将generator函数的控制权转交给另外的generator函数。其实会发现,yield*
后面跟着的应该是一个迭代器对象。
可以接受参数的generator
1 | function* acceptParamGenerator(param) { |
可以看到,我们通过这种方式可以和generator函数进行通信,我们首先调用next
方法生成了第一个yield
之后的内容,然后传递参数给next
方法,其实这个参数会被yield左侧赋值的变量word
接收。这样实现了在generator函数中的双向通讯,可以通过yield
向外传参,也可以通过next
向generator传参。
注意next
方法只能给等待执行的yield
传参,而不能给第一个yield
传参,因为我们调用next
方法的时候,第一个yield
就会立刻执行。但是我们可以通过给generator函数本身传参,这样也可以实现类似的效果。
向generator抛出异常
1 | function* exceptionGenerator() { |
每一个iterator除了含有一个next
方法之外,还有一个throw
方法,用于向原generator函数抛出异常。