Generator
1.用于异步编程
2.最大的特点是交出函数耳钉执行权(暂停执行)
写法:funcation关键字与函数名之间有一个 星号
可以结合yield语句,定义不同的内部状态(状态,就是数据。内部的额状态,就是函数内部的值
,它在不同的时候,是不一样的)
本质上,Generator函数就是一个封装的异步的任务。异步容器
- 需要使用.next()的方法进行启动,作用是分阶段执行Generator函数
- 每次调用.next()会返回一个对象
- 表示当前阶段的信息
,
value属性
done属性
1. true:表示函数已经执行完成
2.false:表示函数还没有执行完成
yield
有时可以当成return,但是与return的本质不一样
范例1:
function *xxfn(){
yield 'a';
yield 'b';
yield 'c';
return 'd ,end....';
}
var _xxfn = xxfn();
console.log(_xxfn.next()); // done: false value: "a"
console.log(_xxfn.next()); // done: false value: "b"
console.log(_xxfn.next()); // done: false value: "c"
console.log(_xxfn.next()); // done: true value: "d ,end...."
console.log(_xxfn.next()); // done: true value: "undefined"
范例2:
function *test(){
let a =1;
yield ++a;
yield ++a;
yield ++a;
yield ++a;
}
let aa=test()
let bb=test()
console.log(aa.next());
console.log(aa.next());
console.log(bb.next());
console.log(aa.next());
aa和bb是两个迭代器,不会互相影响
每个迭代器之间是相互独立的,作用域独立
每当你调用了一个迭代器内部的.next()方法,Generator函数内部的指针,
就是从上一次停下的地方,
继续运行,直到遇到下一个yield语句。
最后,为什么说是迭代器对象呢,
因为它得把里面的yield语句都走一遍。
- yield,就像录音机上的暂停键;
- next,就像录音机上的继续键。
Generator函数中的.next()方法可以接收参数
-传入的参数,其实是把上一个yield语句的返回的值给覆盖了;
-第一个.next()方法其实是启动器,
在它之前没有yield语句,
所以给第一个.next()方法去传参是没意义的。
范例:
function* xxfn(){
var _n = 1;
var _v = yield _n +22;
console.log( 'aa---:' +_v);yield ++_n;
yield ++_n;
yield ++_n;
}
var _xxfn = xxfn();
console.log(_xxfn.next());
_xxfn.next('abc')
console.log(_xxfn.next());
解析结果:
1.第一个.next
第一个.next,它返回的value是23,1+22
var _v = yield _n +22;这是一个赋值运算
2.第二个next
传入的参数,其实是把上一个yield语句的返回的值给覆盖了
上一个yield语句的值是,yield = _n +22;
然后你传入了’abc’,
那么上一个yield语句的值,就变成了,yield = ‘abc’;
然后又赋值给了_v,
所以就打印了console.log( ‘aa—:’ +_v),是aa—:abc,
然后遇到了下一个yield就又停了
3.第三个next
传入的参数,其实是把上一个yield语句的返回的值给覆盖了
但是,它并没有修改之前声明的变量_n的值;
_n的值,依然是1,然后二次++_n,
加完是3
Generator函数,支持for of循环,
用来迭代Generator函数在执行时,
生成的那个迭代对象,
范例:
function *xxfn(){
yield 'a';
yield 'b';
yield 'c';
return 'd ,end....';
}
var _xxfn = xxfn();
for(let i of _xxfn){
console.log(i);
}
打印结果:
a
b
c