Generator函数
Generator函数是一种异步编程解决方案。他好比一个状态机,封装了多个内部状态。
执行Generator函数会返回遍历器对象(ITerator Object);
1.Generator函数定义
function* g(){.................}//一般都这么写
2.yield语句
Generator函数正是运用yield语句来定义内部不同的状态。例如:
```
function* f(){
yield 'hello';
yield 'world;
return 'ednding'
}
```
Generator返回的遍历器对象只能调用next()方法来遍历他的内部状态,next()方法的执行逻辑:
遇到yield语句就暂停执行;
下次调用next()方法的时候再继续执行,直到遇到下一个yield语句;
如果下面没有yield语句,就一直向下运行,那遇到return语句为止;
如果没有return语句,则运行到函数尾部,并返回value:undefinned;
注意:
(1)yield后面的语句不会执行,只有在next()方法将指针移到这一句时才求值,例如:
```
function* gen(){
console.log('执行了’)
}
vargenerator = gen(); //此处没有任何输出 gen() 仅仅是创建了一个generator对象,还没有去执行它
generator.next(); //此处输出为“执行了”
```
(2)yield语句不能在普通函数里,否则会报错。
3.next方法参数
yield语句没有返回值,所有都返回undefined;例如:var r = yield 1; r其实值为undefined
next 方法可以带参数,该参数作为上一条yield语句的返回值。
4.for...of循环(原生的JavaScript对象没有遍历接口,所以无法使用for...of循环)
for...of 循环可以自动遍历Generator函数,而不用再使用next 方法;例如
```
function* foo(){
yield 1;
yield 2;
yield 3;
yield 4;
return 5;
}
for(let v of foo()){
console.log(v)
}
//1,2,3,4
```
注意:一旦next返回对象的done属性为true,for...of 就会终止,且不包含该返回对象
5.Generator.prototype.return()
Generator函数返回的遍历器对象还有一个return方法,可以返回给定的值,并终结Generator函数的遍历。
仍沿用4里面的例子:
```
var f = foo();
f.next() //{value:1,done:false}
f.return("foo") //{value:"foo",done:true} 如果return方法里面没有跟参数那么返回值value为undefined
f.next() //{value:undefined,done:true}
```
6.yeild* 语句
如果在Generator函数内部调用另一个Generator函数默认情况下是没有效果的;
这是就要用到yield*语句
7.作为对象属性的Generator函数
```
let obj = {
* myGeneratorMethod(){
...........
}
```
8.Generator函数的this指针
Generator函数总返回一个遍历器,ES6规定这个遍历器是Generator函数的实例,他也继承了Generator函数的prototype的对象上的实例。