promise 和 async await比較

?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ù)可以說是目前異步操作最好的解決方案)。??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容