generator函数
generator
函数是es6提供的一种异步编程解决方案,这个方法比较抽象。
generator
函数可以返回多次的函数看看下面这个例子你就很容易明白
如果一个普通函数要返回1-10就只能使用数组或者其他方式存储和generator
就可以一次次返回
function* add() {
for(let i =0; i<10; i++) {
yield i;
}
}
let a = add();
console.log(a.next()); //{value: 0, done: false}
console.log(a.next());//{value:1, done: false}
function add2() {
let arr =[];
for(let i =0; i<10; i++) {
arr.push(i);
}
return arr;
}
console.log(add2()); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
那么前面提到的异步编程
是什么意思?
看一下这个例子你就会觉得
function* hello(){
console.log("hello开始执行");
yield ; //暂停
console.log("hello 执行结束") //执行完返回
}
let h = hello();
h.next(); //开始执行
console.log("外部开始执行");
h.next();//重新回到hello
console.log("外部执行结束");
这个操作有点类似pv
操作,也可以理解成可以暂停的函数
另外还有一个很重要的点generator
函数执行结束
会返回一个空值
我们就拿上面的例子
在来做一点改造
function* hello(){
console.log("hello开始执行");
yield 1; //暂停
console.log("hello 执行结束") //执行完返回
}
let h = hello();
console.log(h.next()); //开始执行{value: 1, done: false}
console.log("外部开始执行");
console.log(h.next());//重新回到hello{value: undefined, done: true}
console.log("外部执行结束");
可以看出返回了一个对象value:1
是返回的值,并且还有一个done
用来判断执行结束
了 ,当结束为true
还没结束为false
next
也可以传参数
function* add(x){
var y = yield x +2;
return y;
}
var g = add(1);
console.log(g.next()); //{value: 3, done: false}
console.log(g.next(4));//这里传入的4会作为上一次调用返回的结果 {value: 4, done: true}
谈谈对generator函数的理解
generator是es6提供的一种异步编程解决方案,是可以控制执行的函数,与普通函数相比关键字function
与函数名之间多了一个*
号,并且可以返回多个值(也是称为状态)