以前知道es6的generator很好使,並且還有點複雜,項目趕上了又有點忘記了因此又重溫下,同時記錄下來,方便之後回憶 es6
①function關鍵字與函數名之間有* ②函數體內有yieldbash
①執行生成器函數,至關於生成一個實例 ②實例調用next()在最開始或者上一個暫停處向下執行至下一個yield或者return(yield是暫停,next()是播放😄是否是很帶感)異步
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閱讀指針