async await詳解

async await本身就是promise + generator的語(yǔ)法糖。

本文主要講述以下內(nèi)容

  1. async awiat 實(shí)質(zhì)
  2. async await 主要特性

async await 實(shí)質(zhì)

下面使用 promise + generate 實(shí)現(xiàn) async await

    // 轉(zhuǎn)換目標(biāo) async1
    // async function async1() {
    //    console.log('async1 start');
    //    await async2();
    //    console.log('async1 end');
    // }

    function async1() {
        // 將 async 轉(zhuǎn)換成 *,將 awiat 轉(zhuǎn)換成 yield
        var awaitInstance = (function* () {
            console.log('async1 start');
            yield async2();
            console.log('async1 end');
        })()

        // 自動(dòng)執(zhí)行 await 及后續(xù)代碼
        // 簡(jiǎn)單起見(jiàn),不處理異常情況
        function step() {
            var next = awaitInstance.next();
            // 使用Promise獲取 異步/同步 方法的結(jié)果,再執(zhí)行下一步
            Promise.resolve(next.value).then(function (val) {
                if (!next.done) step();
            })
        }
        step();

        // 返回Promise
        return Promise.resolve(undefined);
    }

async await 特性

  1. async 一定會(huì)返回 promise
    // 案例1: 不設(shè)置return
    async function fn() {}
    fn().then(alert); // alert -> undefined

    // 案例2:return非promise
    async function f() {
        return 1
    }
    f().then(alert); // alert -> 1

    // 案例3: return Promise
    async function fn() {
        return Promise.resolve(2);
    }
    fn().then(alert); // alert -> 2
  1. async 中代碼是直接執(zhí)行的(同步任務(wù))
    console.log(1);

    async function fn() {
        console.log(2);
        await console.log(3)
        console.log(4)
     }
    fn();

    console.log(5);

    // 打印 1 2 3 5 4
    // 為何后面是 3 5 4 ? 往下看
  1. await是直接執(zhí)行的,而await后面的代碼是 microtask。
    async function async1() {
        console.log('async1 start');
        await async2();
        console.log('async1 end');
    }

    // 類(lèi)似于
    async function async1() {
        console.log('async1 start');
        Promise.resolve(async2()).then(() => {
            console.log('async1 end');
        })
    }
  1. await后面代碼會(huì)等await內(nèi)部代碼全部完成后再執(zhí)行
    async function async1() {
        console.log('async1 start');
        await async2();
        console.log('async1 end');
    }

    async function async2() {
        return new Promise(function(resolve) {
            setTimeout(function() {
                console.log('sleep 2s');
                resolve('do');
            }, 2000)
        })
    }

    async1();

    // 打印結(jié)果
    // async1 start -> sleep 2s -> async1 end
  1. await 操作符用于等待一個(gè)Promise 對(duì)象陕悬。它只能在異步函數(shù) async function 中使用。參考 MDN
    附:
    在chrome版本 73.0.3683.86(64 位)中,
    await是可以直接使用的姆蘸。

    var x = await console.log(1)

End

持續(xù)更新中 來(lái)Github 點(diǎn)顆?吧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末墩莫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逞敷,更是在濱河造成了極大的恐慌狂秦,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件推捐,死亡現(xiàn)場(chǎng)離奇詭異裂问,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)牛柒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)堪簿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人皮壁,你說(shuō)我怎么就攤上這事椭更。” “怎么了蛾魄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵虑瀑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我滴须,道長(zhǎng)舌狗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任扔水,我火速辦了婚禮痛侍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魔市。我一直安慰自己主届,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布待德。 她就那樣靜靜地躺著岂膳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磅网。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天筷屡,我揣著相機(jī)與錄音涧偷,去河邊找鬼簸喂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛燎潮,可吹牛的內(nèi)容都是我干的喻鳄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼确封,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼除呵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起爪喘,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颜曾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后秉剑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泛豪,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年侦鹏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诡曙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡略水,死狀恐怖价卤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渊涝,我是刑警寧澤慎璧,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站驶赏,受9級(jí)特大地震影響炸卑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜煤傍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一盖文、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚯姆,春花似錦五续、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至郭毕,卻和暖如春它碎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工扳肛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傻挂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓挖息,卻偏偏與公主長(zhǎng)得像金拒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子套腹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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