淺談async/await

簡(jiǎn)介

使用async/await可以方便處理js中的異步情況,這是ES2017提出來(lái)的一對(duì)很好用的操作符。

async

函數(shù)開頭加的一個(gè)關(guān)鍵字, 返回一個(gè)promise對(duì)象,如果函數(shù)直接返回一個(gè)值,則會(huì)用promise.resolve()包裹起來(lái)。

async function demo() {
    return 'demo';
}
demo().then((data) => {
    console.log(data);
})

await

await 意思是等待,等待的是一個(gè)表達(dá)式,可以是常量,變量,promise,函數(shù)等。

function demo1() {
    return 'demo1';
}
const demo2 = 'demo2';

async function test() {
    const a = await demo();
    const b = await demo1();
    const c = await demo2;
    console.log(`a:${a},b:$,c:${c}`);
}
test();

解惑

  • 問(wèn)題1:await關(guān)鍵字只能在async函數(shù)中用嗎?
    答:是的,await等待的是一個(gè)返回的結(jié)果,同步情況下,直接返回,異步情況下await會(huì)阻塞執(zhí)行流程,直到結(jié)果返回,才會(huì)繼續(xù)下面的代碼。阻塞代碼是意見(jiàn)很可怕的事,而async函數(shù),返回的是一個(gè)promise對(duì)象,異步執(zhí)行,所以await只能在async函數(shù)中使用,如果正常程序中使用,會(huì)造成整個(gè)程序阻塞,得不償失。

  • 問(wèn)題2:await只會(huì)等待一個(gè)結(jié)果,那么發(fā)生錯(cuò)誤了該如何處理?
    答:我們知道promise返回的不僅僅只有resolve,還有一個(gè)reject的情況,所以我們可以用以下情況去處理錯(cuò)誤:

  1. 用try-catch
async function tryCatch() {
    try {
        await Promise.reject('tryCath');
    } catch(err) {
        console.log(err);
    }
}
tryCatch();
  1. 用promise的catch
async function tryCatch1() {
    await Promise.reject('tryCath1').catch((err) => {
        console.log(err);
    });
}
tryCatch1();
  • 問(wèn)題3:async/await和promise哪個(gè)好?
    答:個(gè)人覺(jué)得async/await比promise好多了,理由如下:
    (1)簡(jiǎn)潔,不需要寫.then,也不需要定義多余的結(jié)果變量,避免嵌套
    (2)可以同時(shí)處理同步和異步錯(cuò)誤,在promise中,try/catch不能處理JSON.parse的錯(cuò)誤,因?yàn)樵趐romise中,我們需要使用.catch,代碼非常冗余
    (3)對(duì)于一些條件判斷,數(shù)據(jù)可以直接返回進(jìn)行比較,避免嵌套,更加直觀
    (4)調(diào)試方便
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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