什么是Generator生成器?
生成器是通过构造函数Generator创建出的对象,生成器既是一个迭代器,又是一个可迭代的对象。
- ES6新增可解决异步编程的方案
- 可允许一个函数返回的可遍历对象生成多个值
Generator函数
只需要把函数变成Generator函数
生成器函数:生成器是通过function*
关键字定义,*号的位置没有严格规定,只要在中间就行
注意:async
和*
不能同时加
function *test(){
let info = yield 1;
console.log(info)
info = yield 2 + info;
console.log(info)
}
const generator = test();
注意点:
1.生成器有返回值,出现在最后一次的done为true的value中
2.调用生成的next方法时,可以传递参数,传递的参数会交给yield表达式的返回值
3.第一次去调用函数的时候,传递的参数是没有任何含义的
return方法
return()调用以后,可以提前结束生成器函数,整个的迭代过程也会提前结束
还可以调用 throw()
function* fun(){
yield 1;
yield 2;
yield 3;
}
const generator = fun();
console.log(generator.next().value); //1
console.log(generator.return(9).value); //9 return() 调用之后,提前结束了
console.log(generator.next().done);//true
关键字yield的使用
yield关键字是用来暂停和恢复一个遍历器函数的运行的------来自MDN的解释翻译
- 在运行.next(),遇到了一个yield命令,就会暂停
function* fun() {
let i = 1;
while(true){
yield i++;
}
}
let obj= fun();
obj.next(); //{value: 1, done: false}
obj.next(); //{value: 2, done: false}
obj.next(); //{value: 3, done: false}
obj.next(); //{value: 4, done: false}
上面例子中,定义了一个fun的生成器函数,调用之后返回了一个迭代器对象(obj),
然后在调用next方法后,函数内执行第一条yield语句时,输出状态为done,以及相应值。
yield的每一次执行,返回的值变为迭代器的下一个值,执行一次yield语句就在该处暂停,所用的yield语句执行完,
return完之后,就退出了生成器函数,后面若还有yield操作就不会再执行。
- 注意点:yield只能在Generator函数的内部使用,表示产生一个迭代数据,在一般的函数内使用会报错