?promise 和 async await比較
async搭配await是ES7提出的,它的實現(xiàn)是基于Promise造虏。這里使用它對比Promise的用法,這里只是簡單的適合日常業(yè)務(wù)的使用場景。
async怀骤、await是ES7中的提案击敌,通過同步方式的寫法介返,使得代碼更容易閱讀。
注意:await函數(shù)不能單獨使用沃斤,而且async函數(shù)返回的是一個Promise對象圣蝎,可以使用then函數(shù)添加回調(diào)函數(shù)。當(dāng)函數(shù)執(zhí)行的時候衡瓶,一旦遇到await函數(shù)就會先返回一個Promise對象徘公,等到異步操作完成,再去執(zhí)行后面的語句哮针。如果 await 后面的異步操作出錯关面,那么等同于 async 函數(shù)返回的 Promise 對象被 reject!
Promise是ES6的新特性十厢,用于處理異步操作邏輯等太,用過給Promise添加then和catch函數(shù),處理成功和失敗的情況蛮放,下面就兩種情況介紹異步缩抡,剛剛?cè)腴T把自己的理解寫出來沉淀一下。
function timeout(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms);
})
}
// 調(diào)用函數(shù)
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
// 調(diào)用函數(shù)
asyncPrint('timeout', 2000); // 2s之后打印出'timeout',如果不相信可以使用vscode編輯器的run code插件包颁,會把執(zhí)行時間展示給你瞻想!
下面是Promise的實現(xiàn)同樣的功能
function timeout1(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms);
})
}
// 因為上面函數(shù)返回是的Promise對象,所以直接使用鏈?zhǔn)椒椒╰hen時娩嚼,是在Promise對象內(nèi)的函數(shù)執(zhí)行完之后執(zhí)行的蘑险,這樣就可以達到上面同樣的結(jié)果
timeout1(5000).then(() => {
console.log('timeout1'); // 5s之后打印出'timeout1'
})
這里多啰嗦兩句,即使我們的設(shè)定的延時器的時間是2s和5s待锈,但是真的跑出來的時間其實會多于2s和5s漠其,這是因為執(zhí)行其他的代碼也會浪費時間啊,只是我們的感知不強而已竿音,而且這是沒辦法避免的和屎。即使你寫的時間間隔為0,它也不會實現(xiàn)理想情況下的立即執(zhí)行春瞬,原因就是剛剛說的那樣柴信。
個人喜歡async和await的寫法,主要是閱讀代碼的時候更加語義化宽气,看著舒服随常。而且看到一些權(quán)威文章上也推薦async 潜沦、await 去處理異步情況,(原畫:async函數(shù)可以說是目前異步操作最好的解決方案)绪氛。??