一媳瞪、Callback回調(diào)函數(shù)
例子:
asyncFun1((err,result1)=>{
if(err){
console.error(err)
}
asyncFun2((err,result2)=>{
if(err){
console.error(err)
}
asyncFun3(()=>{
if(err){
console.error(err)
}
},result2)//把前面操作的結(jié)果result2傳進(jìn)來(lái)
},result1)
})
callback函數(shù)應(yīng)用舉例:
就是通過(guò)callback回調(diào)函數(shù)來(lái)傳回?cái)?shù)據(jù)
缺點(diǎn):多重嵌套,容易造成“回調(diào)地獄”照宝,解決辦法是Promise
二、Promise
例子:
asyncFun1()//內(nèi)部函數(shù)執(zhí)行是異步的句葵,不知道什么時(shí)候執(zhí)行成功厕鹃,所以如果成功就調(diào)resolve(),失敗就調(diào)reject()
.then(result=>{//然后作為then的參數(shù)接收調(diào)用結(jié)果乍丈,then('success','failure')剂碴,這里failure可選
return asyncFun2(result)//又是一個(gè)Promise對(duì)象
})
.then(result=>{
return asyncFun3(result)
})
.catch(err=>{//統(tǒng)一的catch做錯(cuò)誤處理
console.error(err)
})
promise應(yīng)用舉例:
也就是通過(guò)返回一個(gè)promise對(duì)象,把收到的結(jié)果放到成功之后的resolve函數(shù)里傳回到調(diào)用該函數(shù)的地方
缺點(diǎn):不能用try/catch轻专,并且還是一個(gè)異步形式的代碼(心智負(fù)擔(dān))忆矛,解決辦法是async/await
三、async/await
例子:
async function asyncMain(){//async表示函數(shù)里有異步操作
try{
const result=await asyncFun1()//await表示緊跟在后面的表達(dá)式需要等待結(jié)果
result=await asyncFun2(result)
result=await asyncFun3(result)
}catch(e){
console.error(e)
}
}
asyncMain()
注:對(duì)async/await的補(bǔ)充
其實(shí)async函數(shù)就是Generator函數(shù)的語(yǔ)法糖请垛,其本質(zhì)是Generator函數(shù)催训,以下為Generator函數(shù)的介紹。
例子:
function* gen(x){//有個(gè)內(nèi)部指針(遍歷器)g
var y=yield x+2;//異步操作需要暫停的地方用yield聲明
return y;
}
執(zhí)行用next()宗收,如var g=gen(1);g.next()就是進(jìn)行第一個(gè)yield輸出3漫拭,再g.next()因?yàn)闆](méi)有yield需要執(zhí)行了就返回undefined,當(dāng)然如果執(zhí)行g(shù).next(2)就返回傳的參數(shù)2
參考:https://zhuanlan.zhihu.com/p/23249103?utm_medium=social&utm_source=weibo