async和await的使用

async函數(shù)

什么是async函數(shù)?

async函數(shù)是使用async關(guān)鍵字聲明的函數(shù)蓝谨。

mdn文檔:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function

async函數(shù)有以下兩個(gè)特點(diǎn):

  1. 函數(shù)的返回值為Promise對(duì)象
  2. Promise對(duì)象的結(jié)果由async函數(shù)執(zhí)行的返回值決定

為什么要用async函數(shù)灌具?

asyncawait關(guān)鍵字讓我們可以用一種更簡(jiǎn)潔的方式寫出基于Promise的異步行為,而無需刻意地鏈?zhǔn)秸{(diào)用promise譬巫。

async函數(shù)怎么使用咖楣?

使用示例:

<script>
    // async 返回一個(gè)Promise對(duì)象。 
    async function main() {
    // 1. 如果返回值是一個(gè)非Promise類型的數(shù)據(jù)芦昔,那返回的是一個(gè)成功的Promise對(duì)象诱贿,結(jié)果是返回的數(shù)據(jù)。
    return 5555;

    // 2. 如果返回的是一個(gè)Promise對(duì)象,那么這個(gè)對(duì)象的狀態(tài)和結(jié)果珠十,就是這個(gè)函數(shù)的狀態(tài)和結(jié)果
    // return new Promise((resolve, reject) => {
    //     // resolve('OK');
    //     // reject('ERROR');
    //     // throw '出錯(cuò)了'
    // })

    // 3. 拋出異常料扰,返回的是一個(gè)失敗的Promise對(duì)象,結(jié)果為throw后面拋出的信息焙蹭。
    // throw 'error';
}   
    let result = main(); 
    console.log(result);
</script>

await表達(dá)式

什么是await表達(dá)式晒杈?

await 操作符用于等待一個(gè)Promise對(duì)象。它只能在異步函數(shù) async function 中使用孔厉。

語法:

[返回值] = await 表達(dá)式;

表達(dá)式:一個(gè)Promise對(duì)象或者任何要等待的值拯钻。

返回值:返回Promise對(duì)象的處理結(jié)果。如果等待的不是Promise對(duì)象撰豺,則返回該值本身粪般。

mdn文檔:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/await

為什么要用await表達(dá)式?

asyncawait關(guān)鍵字讓我們可以用一種更簡(jiǎn)潔的方式寫出基于Promise的異步行為污桦,而無需刻意地鏈?zhǔn)秸{(diào)用promise亩歹。

await表達(dá)式怎么使用?

使用示例:

<script>
    async function main() {
    let p = new Promise((resolve, reject) => {
        resolve('OK');

        // reject('ERROR')  // 配合下面的案例3使用寡润。案例1會(huì)直接報(bào)錯(cuò)捆憎,因?yàn)闆]有異常處理舅柜,await需要手動(dòng)處理異常梭纹。案例2,能夠得到結(jié)果致份,并且拋出異常变抽。
    })
    // 1. await 右側(cè)為Promise對(duì)象的情況,返回值為Promise對(duì)象成功的結(jié)果值氮块。
    // let result = await p;
    // console.log(result);    // OK

    // 2. 右側(cè)為其他類型的數(shù)據(jù)绍载,那么返回值為 await 后面的那個(gè)值
    let result = await 20; 
    console.log(result)     // 20

    // 3. 右側(cè)的Promise對(duì)象為失敗的狀態(tài),則會(huì)拋出異常滔蝉,此時(shí)用try...catch 捕獲異常击儡,可以在catch中拿到失敗的結(jié)果
    // try {
    //     let result = await p;
    // } catch(e) {
    //     console.log(e);
    // }
}    

    main();
</script>

注意:

  1. await必須寫在async函數(shù)中,但async函數(shù)中可以沒有await蝠引。
  2. 如果awaitPromise失敗了阳谍,就會(huì)拋出異常,需要通過try...catch捕獲處理螃概。

案例1:

async與await結(jié)合發(fā)送ajax請(qǐng)求獲取段子矫夯。

html中簡(jiǎn)單的放一個(gè)按鈕就行

<button>點(diǎn)擊獲取段子</button>

js代碼:

<script>
    // 封裝AJAX請(qǐng)求
    function sendAJAX(url) {
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest();
        xhr.open('GET', url);
        xhr.responseType = 'json';
        xhr.send();
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
                if (xhr.status >= 200 && xhr.status < 300) {
                    resolve(xhr.response);
                } else {
                    reject(xhr.status);
                }
            }
        }
    })
}
    // 段子接口地址:https://api.apiopen.top/getJoke

    // 獲取元素
    const btn = document.querySelector('button');
    btn.addEventListener('click', async function() {
        let result = await sendAJAX('https://api.apiopen.top/getJoke');

        console.log(result);
    })

</script>

案例2(簡(jiǎn)單用了下Node.js,可以忽略這個(gè)案例):

使用Node.js讀取三個(gè)文件(任意選三個(gè)文件)中的數(shù)據(jù)并進(jìn)行拼接吊洼,然后在控制臺(tái)輸出训貌。

代碼:

const fs = require('fs');
const util = require('util');
// 回調(diào)函數(shù)方式實(shí)現(xiàn)
fs.readFile('./resource/1.txt', (err, data1) => {
    if (err) throw err;
    fs.readFile('./resource/content.txt', (err, data2) => {
        if (err) throw err;
        fs.readFile('./resource/2.txt', (err, data3) => {
            if (err) throw err;
            console.log(data1 + data2 + data3);
        })
    })
})

// 使用async和await實(shí)現(xiàn)
const mineReadFile = util.promisify(fs.readFile);

async function main() {
    // 如果出錯(cuò)
    try {
        // 讀取文件內(nèi)容
        let data1 = await mineReadFile('./resource/1x.txt');
        let data2 = await mineReadFile('./resource/content.txt');
        let data3 = await mineReadFile('./resource/2.txt');

        console.log(data1 + data2 + data3);
    } catch(e) {
        console.log(e);
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子递沪,更是在濱河造成了極大的恐慌豺鼻,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件款慨,死亡現(xiàn)場(chǎng)離奇詭異拘领,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)樱调,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門约素,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笆凌,你說我怎么就攤上這事圣猎。” “怎么了乞而?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵送悔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我爪模,道長(zhǎng)欠啤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任屋灌,我火速辦了婚禮洁段,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘共郭。我一直安慰自己祠丝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布除嘹。 她就那樣靜靜地躺著写半,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尉咕。 梳的紋絲不亂的頭發(fā)上叠蝇,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音年缎,去河邊找鬼悔捶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晦款,可吹牛的內(nèi)容都是我干的炎功。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼缓溅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛇损!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤淤齐,失蹤者是張志新(化名)和其女友劉穎股囊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體更啄,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稚疹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祭务。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片内狗。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖义锥,靈堂內(nèi)的尸體忽然破棺而出柳沙,到底是詐尸還是另有隱情,我是刑警寧澤拌倍,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布赂鲤,位于F島的核電站,受9級(jí)特大地震影響柱恤,放射性物質(zhì)發(fā)生泄漏数初。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一梗顺、第九天 我趴在偏房一處隱蔽的房頂上張望泡孩。 院中可真熱鬧,春花似錦荚守、人聲如沸珍德。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至薄料,卻和暖如春敞贡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摄职。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工誊役, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谷市。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓蛔垢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親迫悠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹏漆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容