generator:由function*定义,除了return 语句之前,还可以用yield返回多次。
例如:
斐波那契数列(1,2,2,3,5,8,13,21,34)
普通函数:函数只能返回一次,必须返回一个Array。
function fib(max) {
var t,a=0,b=1,arr=[0,1];
while(arr.length < max) {
[a,b] = [a, a+b];
arr.push(b);
}
return arr;
}
generator函数:一次返回一个数,不断返回多次。
function* fib(max) {
var t,a=0,b=1,n=0,arr=[0,1];
while(n<max){
yield a;
[a,b] = [a,a+b];
n++;
}
return;
}
通过不断调用generator对象的next()方法调用函数:
var f=fib(5);
f.next();//{value:0,done:false}
f.next();//{value:1,done:false}
f.next();//{value:1,done:false}
f.next();//{value:2,done:false}
f.next();//{value:3,done:false}
f.next();//{value:undefined,done:true}
第一种方式:next()会执行generator的代码,每次遇到yeild x;就返回一个对象{value:x,done:true/false},然后暂停。
返回的value值就是yeild的返回值,done表示generator函数是否执行完毕:true,表示generator已经全部执行完毕,不要再继续调用next()。
第二种方式:用for...of循环迭代generator,不要自己判断done。
for(var x of fib(10)){
console.log(x);//依次输出0,1,1,2,3.....
}
generator解决异步回调:
普通axios嵌套:
this.$http.get('/data1',data1,(res,err)=>{
if(err){
return handle(err);
}
this.$http.get('./data2',data2,(res,err)=>{
if(err){
return handle(err)
}
return success(res)
})
})
使用generator解决异步回调:
try{
let r1=yield this.$https.post('./data1',data1)
let r2=yield this.$http.post('./data2',data2)
success(r2)
}catch(e){
handle(e)
}
generator解决异步读取文件:
function* g(){
try{
let data1=yield readFile('./data1.json')
let data2=yield readFile('./data2.json')
let data3=yield readFile('./data3.json')
console.log(data1.toString(),data2.toString(),data3.toString())
}catch(e){
console,log(e)
}
}