ES2017新增
async
語(yǔ)法初家,用一種很優(yōu)雅的方式去實(shí)現(xiàn)了異步操作清酥,具體講解可以參照阮一峰大神的文章购公。
以往的異步操作,都是使用callback
的方式去實(shí)現(xiàn)泊交,例如setTimeout()
函數(shù)乳讥,一旦互相依賴的事件多了,這種方式就很容易造成callback hell
廓俭,不易讀云石,很不友好:
setTimeout(()=>{
console.log(x)
setTimeout(()=>{
console.log(xx)
setTimeout(()=>{
console.log(xxx)
},1)
},1)
},1)
于是乎,又有了Promise
對(duì)象研乒,雖然在很大程度上讓代碼易讀性提高了汹忠,但是一旦依賴多的時(shí)候還是免俗不了層層的.then
:
axios.get('xxx/xxx').then(res=>{
return x
}).then(res=>{
return xx
}).then(res=>{
.......//不斷的嵌套
})
而ES2017新增async
語(yǔ)法,就很好的優(yōu)化了這一點(diǎn):
比如在沒有使用async
語(yǔ)法的時(shí)候雹熬,我們寫的異步函數(shù)是這樣的:
export function readMsg(from){
return (dispatch,getState)=>{
axios.post('/user/readmsg',{from}).then(res=>{
const userid = getState().user._id
if (res.status == 200 && res.data.code == 0) {
dispatch(messageRead(from,userid,res.data.num))
}
})
}
}
我們換成async
語(yǔ)法對(duì)比看看:
export function readMsg(from){
return async (dispatch,getState)=>{
const res = await axios.post('/user/readmsg',{from})
const userid = getState().user._id
if (res.status == 200 && res.data.code == 0) {
dispatch(messageRead(from,userid,res.data.num))
}
}
}
這樣一對(duì)比宽菜,看似修改的地方并不多,但是竿报,實(shí)際上用的就是一種同步的書寫方式铅乡,我們能看到,這種方式烈菌,隱式的執(zhí)行了異步操作阵幸,使用await
來(lái)做異步的等待,這樣芽世,無(wú)論你有幾個(gè)互相依賴的異步要依次執(zhí)行侨嘀,都可以寫的簡(jiǎn)單易懂:
const res = await axios.post('/user/readmsg',{from})
const res1 = await axios.post('/user/xxxxx')
const res2 = await axios.post('/user/yyyyy')
console.log(res,res1,res2)//會(huì)等到所有的異步都執(zhí)行完再執(zhí)行
值得注意的是,async
和await
必須要一起使用捂襟。
有了這么方便的語(yǔ)法咬腕,以后的異步函數(shù),我覺得可以盡可能的用它來(lái)實(shí)現(xiàn)葬荷。