探索es6系列之----Generator生成器函数

559 阅读1分钟

之前知道es6的generator很好使,而且还有点复杂,项目遇上了又有点忘记了所以又重温下,同时记录下来,方便以后回忆

1. Generator两个特征

①function关键字与函数名之间有* ②函数体内有yield

执行流程

①执行生成器函数,相当于生成一个实例 ②实例调用next()在最开始或者上一个暂停处向下执行至下一个yield或者return(yield是暂停,next()是播放😄是不是很带感)

next(param)带参数

next的参数为上一条yield的返回值

举个🌰

function* foo(x) {
    var y = 2*(yield(x+2))
    var z = yield(y/4)
    return x+y+Z
}
let bar = foo(2)
bar.next() //{value:4,done:false} 返回yield(2+2)= 4
bar.next(7) //{value:4,done:false} 设置yield(x+2) = 7,那么y= 2*7=14,那么yield(y/4) = 3.5
bar.next(3) //{value:4,done:false} 设置z = yield(y/4) = 3 那么 x+y+z = 2+14+3 = 19

##es7的async函数(偷偷告诉你,未来这个肯定很常见)
其实async函数就是换了个马甲,把*换成了async ,把yield换成await;看起来语义化一些,不过,人家还是有变化的:async可以不用挨个调用next()去移动指针。而是等待await后面的语句执行完成(包括异步请求或其他操作),才会继续执行,达到同步的效果。而且aysnc返回的是Promise对象

举个🌰

async function fun(item){
    let sym = await myfun1(item);//执行第一个异步请求
    let haha = await myfun2(sym);//执行第二个请求
    return haha
}
let result = fun('test').then(res => {
    console.log(res)
}).catch(err =>{
    console.error(err)
})

blog阅读