Generator 是一种异步函数解决方案;语法和传统的方法完全不相同;Generator有多种解释;首先可以把它理解成内部有多种状态;Generator是一种状态机内部有多种状态;
Generator 有两个关键特征;首先每个函数都带一个* 第二个就是每个函数都 第二个就是函数内部使用yield函数;定义不同的内部状态;
function* helloWolidgenerator(){
yield 'hello';
yield 'world';
return 'ending';
};
上面定义Generator函数;里面定义三个状态一个是'hello' 'world' 以及return;每一个yield就是一个函数;
另外就是调用方法的问题;Generator的调用不像其他函数一样就是直接使用();在Generator上交过()后;函数并不执行;只是返回了函数的一个指针;及内部状态的指针;
var hw=helloWorldgenertor();
下一步,必须调用遍历器对象的next方法,
使得指针移向下一个状态。也就是说,每次调用next方法,
内部指针就从函数头部或上一次停下来的地方开始执行,
直到遇到下一个yield表达式(或return语句)为止。
换言之,Generator 函数是分段执行的,yield表达式是暂停执行的标记,
而next方法可以恢复执行。
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }
第一次调用,Generator 函数开始执行,直到遇到第一个yield表达式为止。next方法返回一个对象,它的value属性就是当前yield表达式的值hello,done属性的值false,表示遍历还没有结束。
第二次调用,Generator 函数从上次yield表达式停下的地方,一直执行到下一个yield表达式。next方法返回的对象的value属性就是当前yield表达式的值world,done属性的值false,表示遍历还没有结束。
第三次调用,Generator 函数从上次yield表达式停下的地方,一直执行到return语句(如果没有return语句,就执行到函数结束)。next方法返回的对象的value属性,就是紧跟在return语句后面的表达式的值(如果没有return语句,则value属性的值为undefined),done属性的值true,表示遍历已经结束。
第四次调用,此时 Generator 函数已经运行完毕,next方法返回对象的value属性为undefined,done属性为true。以后再调用next方法,返回的都是这个值。
总结一下,调用 Generator 函数,返回一个遍历器对象,代表 Generator 函数的内部指针。以后,每次调用遍历器对象的next方法,就会返回一个有着value和done两个属性的对象。value属性表示当前的内部状态的值,是yield表达式后面那个表达式的值;done属性是一个布尔值,表示是否遍历结束。
网友评论