Generator和yield
Generator
Generator函数是ES6提出的异步解决方案,可以理解为他是一个状态机,并且内部封装了很多状态。
Generator函数有两个最主要的特征,一个是function与函数名之前有星号(function* generator(){ }),第二个是函数内部使用yield语句,来区分不同的状态。
function* generator(){
yield 'This';
yield 'is';
yield 'generator';
return 'end';
}
var lv = generator();
现在已经在上面定义了一个Generation函数generator,在其内部有三个yield语句,yield在Generation函数中相当于断点的作用,函数定义完毕之后不会自动执行,必须使用next()方法。每次调用next()方法,函数开始执行或者从上次停止的地方运行,直到遇到下一个yield或return(相当于断点),停止执行。

从上面截图可以看到我们一共调用了五次next()方法,返回的value的属性即为当前yield语句的值This,done代表遍历是否完成。
第一次调用,启动Generation函数,到第一个yield (断点),停止。next返回一个对象,value属性是当前yield语句的值(This),done的属性为false,表示遍历没有完成。
第二次调用,从上一个yield语句停下的地方继续,到下一个yield停止。next返回一个对象,value属性是当前yield语句的值(is),done的属性为false,表示遍历没有完成。
第三次调用,从上一个yield语句停下的地方继续,到下一个yield停止。next返回一个对象,value属性是当前yield语句的值(generator),done的属性为false,表示遍历没有完成。
第四次调用,从上一个yield语句停下的地方继续,到return停止(如果没有return语句,执行完整个函数,value的值为undefined)。next返回一个对象,value属性是当前return语句的值(end),done的属性为true,表示遍历已经完成。
第五次调用,此时generator函数已经运行完毕,再次调用next方法,返回的value都会是undefined,done为true。
其实Generation函数返回遍历器对象,代表generation的内部指针。每次调用next方法的时候,返回一个value和done的对象,相应的值分别代表yield语句的值和遍历是否结束。
yield
因为Generation函数返回的是遍历器对象,且不会自己执行,每次执行都需要借助next方法,而yield在函数中的作用就是告诉next方法在哪里暂停和下一次从哪里开始。
每次调用next方法开始运行,遇到yield或者return停止运行,把yield语句里面的值返回,同时返回代表遍历是否结束的标识,不存在return时,yield的值变为undefined,同时done返回值为true,代表遍历已经结束。
一个Generation正常只有一个return,因为只要走到return,之后在调用next也不会执行,这也是yield和return的区别。
function* sum(){
yield 777 + 7777;
//这里不会进行计算 只有调用next方法之后才会进行计算。
}