generator

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)
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值