Generator函数是ES6引入的新语法,主要用于异步编程,所以本质上Generator就是一个异步任务的容器,最大特点就是它可以暂停执行
它与普通函数的区别:
- 函数定义时要在函数名前加*
- 函数内部使用yield来定义不同的状态
- yeild命令是函数内部不同阶段的分界线
- 调用函数时通过 next()方法获取当前状态
- 每调用一次 next() 都会返回一个对象,表示当前的状态
- value 表示当前值,也就是当前yield的返回值
- done 表示函数是否结束,true表示函数执行完毕
- 每调用一次 next() 都会返回一个对象,表示当前的状态
function* xxfn(){
yield 'a';
yield 'b';
yield 'c';
return 'd end';
}
let _xxfn=xxfn();
// 第一个yield语句
console.log(_xxfn.next()); //a
// 第二个yield语句
console.log(_xxfn.next()); //b
// 第三个yield语句
console.log(_xxfn.next()); //c
// 第四个
console.log(_xxfn.next()); //d end done为true
//再执行next value会返回undefined
next()方法带参
- next的参数会将上一个yield的返回值给覆盖掉
- 第一个next是启动器,没有上一个next,故第一个next的参数是没有意义的
- 可以通过next来分段注入数据
function* xxfn(){
let n=1;
let v = yield n + 22;
console.log(v);
yield ++n;
yield ++n;
return 'd end';
}
let _xxfn=xxfn();
// 第一个yield语句
// 返回 n + 22,暂停没有赋值给v
console.log(_xxfn.next()); // {vlaue:23,node:false}
// 第二个yield语句
// abc将上一个yield语句返回值覆盖掉了
// 故v = yield 'abc' ==> v ='abc'
_xxfn.next('abc'); // 'abc'
// 第三个yield语句
// 输入next会覆盖前一个next返回值,但是并不会修改n的值
console.log(_xxfn.next()); // {vlaue:3,node:false}
// 第四个
console.log(_xxfn.next()); //d end done为true