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

以前知道es6的generator很好使,並且還有點複雜,項目趕上了又有點忘記了因此又重溫下,同時記錄下來,方便之後回憶 es6

1. Generator兩個特徵

①function關鍵字與函數名之間有* ②函數體內有yieldbash

執行流程

①執行生成器函數,至關於生成一個實例 ②實例調用next()在最開始或者上一個暫停處向下執行至下一個yield或者return(yield是暫停,next()是播放😄是否是很帶感)異步

next(param)帶參數

next的參數爲上一條yield的返回值async

舉個🌰 函數

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對象ui

舉個🌰spa

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閱讀指針

相關文章
相關標籤/搜索