Generator函数是ES6引入的新型函数,用于异步编程,跟Promise对象联合使用的话,会极大降低异步编程的编写难度和阅读难度。
1.function关键字和函数名之间有一个*;
2.函数体内部使用yield语句,定义不同的内部状态
最简单的Generator函数如下:
function * gen(){
yield "a";
yield 1;
yield "c";
return "ending";
}
gen()返回的是一个Generator对象
gen函数有四个阶段,分别为a,1,c,ending。
3、Generator函数神奇之一:gen()并不执行gen函数
gen()并不会执行gen函数,返回的也不是函数运行结果
而是一个指向内部状态的指针对象,也就是迭代器对象(Iterator Object);
4、Generator函数神奇之二: 分段执行
var g = gen();
g.next();-----返回的是一个非常简单的对象{value:"a",done:"false"}
value指的是一个yield语句之后得到的值
false表示gen函数还没执行完,只是在这暂停
g.next();-----返回的是一个非常简单的对象{value:1,done:"false"}
value指的是一个yield语句之后得到的值
false表示gen函数还没执行完,只是在这暂停
g.next();-----返回的是一个非常简单的对象{value:1,done:"false"}
value指的是一个yield语句之后得到的值
false表示gen函数还没执行完,只是在这暂停
如果再写一行g.next();返回的是{value:ending,done:"true"}
之后写一行g.next();返回的是{value:undefined,done:"true"}
备注1:如果没有写return语句
那么第三次g.next()之后就返回{value:undefined,done:"true"}
这个第三次的next()唯一的意义就是证明g函数全部执行完毕了。
备注2:如果return后面还有yield
return表示函数的所有有效语句借宿,无论下方还有多少语句都不会执行
备注3:如果函数没有yield和return语句
g.next()调用后就直接返回{value:undefined,done:"true"}
目前就理解到此---需要继续理解