async await原理

async/await 的基礎使用及原理簡介?https://www.cnblogs.com/zhengyufeng/p/11106901.html

async/await是es7推出的一套關于異步的終極解決方案,為什么要說他是終極解決方案呢惶我?因為他實在是太好用了,而且寫起來還非常的簡單。

一:async/await基礎語法

// 定義一個異步函數(shù)(假設他是一個異步函數(shù))getJSON(){return'JSON'}// 在需要使用上面異步函數(shù)的函數(shù)前面,加上async聲明,聲明這是一個異步函數(shù)asynctestAsync(){// 在異步函數(shù)前面加上await骡和,函數(shù)執(zhí)行就會等待用await聲明的異步函數(shù)執(zhí)行完畢之后,在往下執(zhí)行awaitgetJSON()? ? ...剩下的代碼}

以上就是async/await最基本的用法相寇。

還需要注意的一點就是使用async/await的時候慰于,是無法捕獲錯誤的,這個時候就要用到我們es5里面一個被大家遺忘了的try/catch唤衫,來進行錯誤的捕獲:

asynctestAsync() {try{awaitgetJSON()? }catch(err) {console.log(err)? }? ...剩下的代碼}

注意:

1.async函數(shù)在聲明形式上和普通函數(shù)沒有區(qū)別婆赠,函數(shù)聲明式,函數(shù)表達式战授,對象方法页藻,class方法和箭頭函數(shù)等都可以聲明async函數(shù)。

2.任何一個await語句后面的 Promise 對象變?yōu)閞eject狀態(tài)植兰,那么整個async函數(shù)都會中斷執(zhí)行份帐。

3.async函數(shù)返回的 Promise 對象,必須等到內(nèi)部所有await命令后面的 Promise 對象執(zhí)行完楣导,才會發(fā)生狀態(tài)改變废境,除非遇到return語句或者拋出錯誤。也就是說筒繁,只有async函數(shù)內(nèi)部的異步操作執(zhí)行完噩凹,才會執(zhí)行then方法指定的回調(diào)函數(shù)。

二:async/await

async

async這個單詞大家應該都比較熟悉毡咏,他是英文單詞‘異步’的簡寫驮宴,代表的意思也是異步。

asyncfunctiontestAsync(){return"hello async";}constresult = testAsync();console.log(result);

輸出結果:

Promise{:"hello async"}

可以看出async函數(shù)呕缭,返回的是一個Promise對象

await

await是英文單詞‘等待’的意思堵泽,代表的意思也是等待,那他等的到底是個什么東西呢恢总?還是一個Promise迎罗。

三 async/await和Generator

Generator函數(shù):generator(生成器)是ES6標準引入的新的數(shù)據(jù)類型。一個generator看上去像一個函數(shù)片仿,但可以返回多次纹安。下面面是一個Generator函數(shù)的簡單寫法。

function*Generator(){yield'11111111';yield'22222222'return'3333333';? ? ? ? }letaaa = Generator();

Generator函數(shù)和普通函數(shù)一樣通過函數(shù)名+()去調(diào)用,但是調(diào)用完之后并不執(zhí)行厢岂。它僅僅是創(chuàng)建了一個generator對象光督,還沒有去執(zhí)行它。想要運行Generator函數(shù)塔粒,需要通過遍歷器對象的next方法可帽。

leta = aaa.next()letb = aaa.next()letc = aaa.next()letd = aaa.next()? ? console.log(a,b,c,d) //? {value:"11111111",done:false}? ? {value:"22222222",done:false}? ? ? {value:"3333333",done:true}? ? {value: undefined,done:true}

想要Generator函數(shù)執(zhí)行下一步,必須調(diào)用遍歷器對象的next方法窗怒,使得指針移向下一個狀態(tài)映跟。也就是說,每次調(diào)用next方法扬虚,內(nèi)部指針就從函數(shù)頭部或上一次停下來的地方開始執(zhí)行努隙,直到遇到下一個yield表達式或return語句。由此可見辜昵,Generator 函數(shù)是分段執(zhí)行的荸镊,yield表達式是暫停執(zhí)行的標記,而next方法可以恢復執(zhí)行堪置。也就是上面說的可以交出函數(shù)的執(zhí)行權躬存。

上面對Generator函數(shù)做了一個簡單的介紹,接下來說一下async/await和Generator舀锨。

根據(jù)阮一峰老師的介紹岭洲,async函數(shù)就是Generator函數(shù)的語法糖。

圖片:

代碼上看起來坎匿,async函數(shù)就是將 Generator 函數(shù)的星號(*)替換成async盾剩,將yield替換成await。

實際上async函數(shù)對Generator函數(shù)的改進替蔬,體現(xiàn)在一下四點:

1.async函數(shù)自帶執(zhí)行器告私,所以執(zhí)行方式和普通函數(shù)的執(zhí)行方式一樣,通過函數(shù)名+()的方式執(zhí)行承桥。

2.async和await比起*和yield在語義上更清楚驻粟。

3.co模塊約定,yield命令后面只能是 Thunk 函數(shù)或 Promise 對象凶异,而async函數(shù)的await命令后面蜀撑,可以是 Promise 對象和原始類型的值(數(shù)值、字符串和布爾值唠帝,但這時會自動轉(zhuǎn)成立即 resolved 的 Promise 對象)屯掖。

4.async函數(shù)的返回值是 Promise 對象玄柏,這比 Generator 函數(shù)的返回值是 Iterator 對象方便多了襟衰。你可以用then方法指定下一步的操作。

進一步說粪摘,async函數(shù)完全可以看作多個異步操作瀑晒,包裝成的一個 Promise 對象绍坝,而await命令就是內(nèi)部then命令的語法糖。

四:async/await和Promise

上面說了async/await和Generator的關系苔悦,這里再說一下和Promise的關系轩褐,async/await其實是基于Promise的。async函數(shù)其實是把Promise包裝了一下玖详。

下面是一個async/await的寫法:

getConstant() {return1}asyncgetAsyncConstant() {return1}asyncgetPromise() {returnnewPromise((resolved, rejected)=>{? ? resolved(1)? }); }asynctest() {leta =2letc =1awaitgetConstant();letd =3awaitgetPromise();letd =4awaitgetAsyncConstant();return2}

上面的代碼其實真正的在解析執(zhí)行的時候是這樣的:

functiongetConstant(){return1;}functiongetAsyncConstant(){returnPromise.resolve().then(function(){return1;? });}functiongetPromise(){returnPromise.resolve().then(function(){returnnewPromise((resolved, rejected) =>{? ? resolved(1);? });? });}? test() {returnPromise.resolve().then(function(){leta =2;letc =1;returngetConstant();? ? }).then(function(){letd =3;returngetPromise();? ? }).then(function(){letd =4;returngetAsyncConstant();? ? }).then(function(){return2;? ? }); }

通過上面的代碼可以看出async/await的本身還是基于Promise的把介。

因為await本身返回的也是一個Promise,它只是把await后面的代碼放到了await返回的Promise的.then后面,以此來實現(xiàn)的蟋座。

做個練習:

functiongetJson(){returnnewPromise((reslove,reject) =>{? ? ? ? setTimeout(function(){console.log(2)? ? ? ? ? reslove(2)? ? ? ? },2000)? ? ? })? ? }asyncfunctiontestAsync(){awaitgetJson()console.log(3)? ? }? ? testAsync()

上面的代碼是會先打印2還是3拗踢?

答案是2,3

看過上面的童鞋應該知道其實他的真實代碼是這樣的:

functiongetJson(){returnnewPromise((reslove,reject) =>{? ? ? setTimeout(function(){console.log(2)? ? ? ? reslove()? ? ? },2000)? ? })}functiontestAsync(){returnnewPromise((reslove,reject) =>{? ? ? ? getJson().then(function(res){console.log(3)? ? ? ? })? ? })}testAsync()

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末向臀,一起剝皮案震驚了整個濱河市巢墅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌券膀,老刑警劉巖君纫,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芹彬,居然都是意外死亡蓄髓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門舒帮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來双吆,“玉大人,你說我怎么就攤上這事会前『美郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵瓦宜,是天一觀的道長蔚万。 經(jīng)常有香客問我,道長临庇,這世上最難降的妖魔是什么反璃? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮假夺,結果婚禮上淮蜈,老公的妹妹穿的比我還像新娘。我一直安慰自己已卷,他們只是感情好梧田,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般裁眯。 火紅的嫁衣襯著肌膚如雪鹉梨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天穿稳,我揣著相機與錄音存皂,去河邊找鬼。 笑死逢艘,一個胖子當著我的面吹牛旦袋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播它改,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼猜憎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搔课?” 一聲冷哼從身側(cè)響起胰柑,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爬泥,沒想到半個月后柬讨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡袍啡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年踩官,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片境输。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔗牡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗅剖,到底是詐尸還是另有隱情辩越,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布信粮,位于F島的核電站黔攒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏强缘。R本人自食惡果不足惜督惰,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旅掂。 院中可真熱鬧赏胚,春花似錦、人聲如沸商虐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至留拾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲫尊,已是汗流浹背痴柔。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疫向,地道東北人咳蔚。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像搔驼,于是被迫代替她去往敵國和親谈火。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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