async/await

async

作為一個(gè)關(guān)鍵字放在函數(shù)的前面忘瓦,表示該函數(shù)是一個(gè)異步函數(shù)器联,意味著該函數(shù)的執(zhí)行不會(huì)阻塞后面代碼的執(zhí)行 異步函數(shù)的調(diào)用跟普通函數(shù)一樣

async function timeout(){
    return "helloworld";
}
console.log(timeout());
console.log("我在異步函數(shù)后面,會(huì)先執(zhí)行誰呢");
// Promise { 'helloworld' }
// 我在異步函數(shù)后面,會(huì)先執(zhí)行誰呢

可以看出執(zhí)行順序還是函數(shù)先執(zhí)行愈污,但是函數(shù)的返回結(jié)果是一個(gè)Promise對(duì)象,要獲取Promise的返回值應(yīng)該用then方法

async function timeout(){
    return "helloworld";
}
timeout().then((result)=>{
    console.log(result);
});
console.log("我在異步函數(shù)后面轮傍,會(huì)先執(zhí)行誰呢");

// 我在異步函數(shù)后面暂雹,會(huì)先執(zhí)行誰呢
// helloworld

此時(shí)先輸出的就是后面的一串文字,說明異步函數(shù)的執(zhí)行沒有阻塞后面的代碼執(zhí)行创夜,async的內(nèi)部實(shí)現(xiàn)原理就是如果該函數(shù)中有一個(gè)返回值杭跪,當(dāng)調(diào)用該函數(shù)時(shí),默認(rèn)會(huì)在內(nèi)部調(diào)用Promise.solve() 方法把它轉(zhuǎn)化成一個(gè)Promise 對(duì)象作為返回驰吓,若函數(shù)內(nèi)部拋出錯(cuò)誤涧尿,則調(diào)用Promise.reject()返回一個(gè)Promise 對(duì)象

async function timeout1(flag){
    if(flag){
        return "hello world";
    }else{
        throw new Error("error!!");
    }
}

console.log(timeout1(true));
console.log(timeout1(false));
// Promise {<resolved>: "hello world"}
// Promise {<rejected>: Error: error!!...}

既然async返回的是一個(gè)Promise 對(duì)象,那么Promise 的所有用法他都可以用檬贰,如Promise.catch捕獲異常等

await

await即等待现斋,用于等待一個(gè)Promise對(duì)象。它只能在異步函數(shù) async function中使用偎蘸,否則會(huì)報(bào)錯(cuò)
它的返回值不是Promise對(duì)象而是Promise對(duì)象處理之后的結(jié)果
await表達(dá)式會(huì)暫停當(dāng)前 async function的執(zhí)行庄蹋,等待Promise 處理完成。若 Promise 正常處理(fulfilled)迷雪,其回調(diào)的resolve函數(shù)參數(shù)作為 await 表達(dá)式的值限书,繼續(xù)執(zhí)行 async function,若 Promise 處理異常(rejected)章咧,await 表達(dá)式會(huì)把 Promise 的異常原因拋出倦西。?如果 await 操作符后的表達(dá)式的值不是一個(gè) Promise,那么該值將被轉(zhuǎn)換為一個(gè)已正常處理的 Promise赁严。

與Promise對(duì)比
1扰柠、不再需要多層.then方法
假設(shè)一個(gè)業(yè)務(wù)分很多步驟完成,并且每個(gè)步驟都是異步疼约,依賴上一個(gè)步驟的結(jié)果卤档。

function takeLongTime(n) {
    return new Promise(resolve => {
        setTimeout(() => resolve(n + 200), n);
    });
}

function step1(n) {
    console.log(`step1 with ${n}`);
    return takeLongTime(n);
}

function step2(n) {
    console.log(`step2 with ${n}`);
    return takeLongTime(n);
}

function step3(n) {
    console.log(`step3 with ${n}`);
    return takeLongTime(n);
}

// Promise方式
function doIt() {
    console.time("doIt");
    const time1 = 300;
    step1(time1)
        .then(time2 => step2(time2))
        .then(time3 => step3(time3))
        .then(result => {
            console.log(`result is ${result}`);
            console.timeEnd("doIt");
        });
}

doIt();

// async await方式
async function doIt() {
    console.time("doIt");
    const time1 = 300;
    const time2 = await step1(time1);
    const time3 = await step2(time2);
    const result = await step3(time3);
    console.log(`result is ${result}`);
    console.timeEnd("doIt");
}
doIt();

2、可以對(duì)Promise進(jìn)行并行處理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末程剥,一起剝皮案震驚了整個(gè)濱河市劝枣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖舔腾,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溪胶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡稳诚,警方通過查閱死者的電腦和手機(jī)哗脖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扳还,“玉大人懒熙,你說我怎么就攤上這事∑瞻欤” “怎么了工扎?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長衔蹲。 經(jīng)常有香客問我肢娘,道長,這世上最難降的妖魔是什么舆驶? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任橱健,我火速辦了婚禮,結(jié)果婚禮上沙廉,老公的妹妹穿的比我還像新娘拘荡。我一直安慰自己,他們只是感情好撬陵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布珊皿。 她就那樣靜靜地躺著,像睡著了一般巨税。 火紅的嫁衣襯著肌膚如雪蟋定。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天草添,我揣著相機(jī)與錄音驶兜,去河邊找鬼。 笑死远寸,一個(gè)胖子當(dāng)著我的面吹牛抄淑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驰后,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼肆资,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了倡怎?” 一聲冷哼從身側(cè)響起迅耘,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎监署,沒想到半個(gè)月后颤专,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钠乏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年栖秕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晓避。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡簇捍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俏拱,到底是詐尸還是另有隱情挤聘,我是刑警寧澤赊瞬,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響寿烟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜部脚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一译秦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劣纲,春花似錦逢捺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绷柒,卻和暖如春柠新,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辉巡。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工恨憎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郊楣。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓憔恳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親净蚤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钥组,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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