Js 理解異步/回調(diào)/異步同步化/ async/await

異步函數(shù)的理解

關(guān)鍵詞:異步,函數(shù)名當(dāng)參數(shù)傳遞,async/await

異步函數(shù):需要時間去處理它,這個時間可能時間比較長,為了使程序能平穩(wěn)運(yùn)行,就先跳過這個函數(shù),執(zhí)行下一步同步函數(shù).

為此,異步函數(shù)最好的例子就是人工干預(yù),增加運(yùn)行時間,沒有比setTimout()更好的例子了,以下是簡單一個示例代碼:

function delay(){

? ? ? setTimeout( ()=>{

? ? ?console.log('2S 后執(zhí)行')

? ? ?},2000)

}

delay();

console.log('同步優(yōu)先,異步靠邊,回調(diào)墊底');

// 輸出 同步優(yōu)先,異步靠邊,回調(diào)墊底 ? ?2S 后執(zhí)行

異步例子準(zhǔn)備好了, 接下來是回調(diào)函數(shù),很多教程里寫回調(diào)都用callback, 剛開始我也不明白這是什么鳥,后來才明白就是一個函數(shù)名當(dāng)參數(shù)傳遞,,還是最簡單代碼來一個.

function demo( num ,cb){

? ? num=num*2;

? ?return cb(num)

}

function ?control( number){

? ?console.log( number);

? ?return number

}

demo(100,control);

// ?輸出 200

函數(shù)當(dāng)參數(shù)名的精髓,就是主函數(shù)返回一個處理函數(shù)

像上面的 demo 就是一個標(biāo)準(zhǔn)的回調(diào)函數(shù), 回調(diào)函數(shù)的好處就是留下接口部分,通過這個接口,可以寫出更大的處理公共部分的函數(shù),

function ?anothercontrol( num){

? ?return ?num*num;

}

demo(100,anothercontrol)

//傳參是為了更多的拓展接口

回調(diào)函數(shù)還有一種常見寫法,直接寫匿名函數(shù)( function 后面不要名字,簡單粗暴);注意:公共部分的參數(shù)傳遞個數(shù)要寫正確

回調(diào)函數(shù)解決完,我們在回到異步函數(shù),思考一個問題當(dāng)異步函數(shù)遇到回調(diào)函數(shù)時執(zhí)行順序

還是直接上

function demo(num ,cb){

? ?var r = num+1;

? ?setTimeout(()=>{

? ?var z =r+3

? console.log('helllo ?2S later r:'+z)},2000);

? cb(r);

}

function other(x){

? ?var z =x*x

? console.log(x*x)

? return z

}

? demo(2,other);

先輸出9 ?2S或輸出 helllo ?2S later r:6

所以 同步優(yōu)先 異步靠邊 ,回調(diào)墊底 ,是錯誤的., 那怎么按順序執(zhí)行呢,最簡單方法是將回調(diào)函數(shù)寫入異步函數(shù)中

function demo(num ,cb){

? ?var r = num+1;

? setTimeout(()=>{

? var z =r+3

? console.log('helllo ?2S later r:'+z);

?cb(r);

?},2000)

}

OK! 不過這種方法不過方便, 如果涉及到超級多的異步函數(shù)+回調(diào)函數(shù),多層嵌套,恐怕是很頭疼的.有一個最新的好方法是使用今天的主角 ? async/await , 粗暴理解 ?異步你給我等等.

這兩天接觸這東西,是因?yàn)樽罱雽W(xué)KOA ,看了簡\書上的一些教程,綜合自己的理解寫了這個,在這感謝 @白昔月指導(dǎo),同時借鑒了@mingttong,的一些想法,當(dāng)中有很多相當(dāng)不嚴(yán)謹(jǐn),如有錯誤,歡迎私信給我

異步函數(shù)編寫

1 先要有異步的樣子 ? ?就是async, ? 在有函數(shù) ?function ,組合起來 ? async function(){}, 當(dāng)然也可以給他取名 ?async function getvalue(){}; ? ? 潮流寫法 async ()=>{}, 異步函數(shù)中可以沒有等待,但等待中一定要先說好, 因?yàn)榇蠹視r間多恨寶貴.

2 ?接著是等等 await , 等什么? 等一個函數(shù)結(jié)果 ?await function(){}, 綜合起來

async function(){

? ?await function()

}; ? ? ? ? ? ? ? //就是這么簡單,當(dāng)然坑也是無數(shù)個,接下來踩坑

代碼

async function demoAsync(){

?console.log('begin async');

? await setTimeout(()=>{

? console.log (' await coming ')

},2000);

? ?console.log ('await is end ?,now turn me')

}

demoAsync()

出結(jié)果 ?還不是我們想要的 為什么

begin async

?Promise { ?}

> await is end ?,now turn me

await coming

原理 異步等待的是一個期許(Promise) ,生活也一樣 .正確寫法

async function demoAsync(){

? ?console.log('begin async');

? await ?new Promise((resolve, reject)=>{

? setTimeout(()=>{

? ? console.log (' await coming ');

? ? ?resolve('ok');

? ?},2000);

?});

console.log ('await is end ?,now turn me');

}

demoAsync()

有了 期許 ,總是會有結(jié)果.Promise 的結(jié)果來自reslove 和 reject 兩個參數(shù)

上面代碼 返回期許的成功結(jié)果是一個字符串OK , 我們可以直接拿到 返回結(jié)果

var result ?= await new Promsie............// 這種經(jīng)常出現(xiàn)在調(diào)用數(shù)據(jù)庫異步操作取結(jié)果.

封裝一下 ?會比較好看

var ? result ?= await ? a();

接下來如何封裝起來 ?await 等待的是一個期許(Promise)記住這句,我們就返回一個期許給他

function ?pro() {

? ?return new Promise((resolve, reject)=>{

? ?setTimeout(()=>{

? console.log (' await coming ');

? ?resolve('ok');

? },2000);

? });

};

async function demoAsync(){

? ?console.log('begin async');

? ?await ?pro();

? console.log ('await is end ?,now turn me')

}

注意點(diǎn): Promise 中的 resolve 和 reject ?相當(dāng)于函數(shù)中的 return ,只是這個Promise 比較高級, 他能返回兩鐘狀態(tài). ?如果 執(zhí)行到resolve( date ), 等待就直接返回并且附帶一個結(jié)果.如果有異常該如何獲取呢, 交給reject(' wrong'),

格式

try {

? ?var result = await pro();

? ?var result2= await another();

}

catche(err){

console.log(err)

}

就是干脆,錯誤一致傳遞給catch(err),再也不用擔(dān)心異步哪出錯了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末聂沙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惋戏,更是在濱河造成了極大的恐慌惩歉,老刑警劉巖胧华,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件角雷,死亡現(xiàn)場離奇詭異古徒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)臼闻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門鸿吆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人述呐,你說我怎么就攤上這事惩淳。” “怎么了乓搬?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵思犁,是天一觀的道長代虾。 經(jīng)常有香客問我,道長激蹲,這世上最難降的妖魔是什么棉磨? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮学辱,結(jié)果婚禮上乘瓤,老公的妹妹穿的比我還像新娘。我一直安慰自己项郊,他們只是感情好馅扣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布斟赚。 她就那樣靜靜地躺著着降,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拗军。 梳的紋絲不亂的頭發(fā)上任洞,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音发侵,去河邊找鬼交掏。 笑死,一個胖子當(dāng)著我的面吹牛刃鳄,可吹牛的內(nèi)容都是我干的盅弛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叔锐,長吁一口氣:“原來是場噩夢啊……” “哼挪鹏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起愉烙,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤讨盒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后步责,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體返顺,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年蔓肯,在試婚紗的時候發(fā)現(xiàn)自己被綠了遂鹊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔗包,死狀恐怖秉扑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情气忠,我是刑警寧澤邻储,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布赋咽,位于F島的核電站,受9級特大地震影響吨娜,放射性物質(zhì)發(fā)生泄漏脓匿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一宦赠、第九天 我趴在偏房一處隱蔽的房頂上張望陪毡。 院中可真熱鬧,春花似錦勾扭、人聲如沸毡琉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桅滋。三九已至,卻和暖如春身辨,著一層夾襖步出監(jiān)牢的瞬間丐谋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工煌珊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留号俐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓定庵,卻偏偏與公主長得像吏饿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蔬浙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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

  • 弄懂js異步 講異步之前猪落,我們必須掌握一個基礎(chǔ)知識-event-loop。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,710評論 0 5
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持敛滋,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券许布,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,377評論 9 19
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品绎晃,去做同樣的事情蜜唾,實(shí)現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,752評論 2 17
  • 你不知道JS:異步 第四章:生成器(Generators) 在第二章庶艾,我們明確了采用回調(diào)表示異步流的兩個關(guān)鍵缺點(diǎn):...
    purple_force閱讀 957評論 0 2
  • 01 我坦白袁余,我是路癡。而且不是一天兩天的事了咱揍。 02 最早發(fā)現(xiàn)我路癡特質(zhì)的人是我媽颖榜。小時候我們鎮(zhèn)上有個供銷社,正...
    若水17閱讀 882評論 4 3