拉勾前端學習-模塊一-JavaScript異步編程

  • 同步模式與異步模式
    • 單線程
      最初設計為瀏覽器腳本,用于操作DOM语卤,為了避免線程同步的不問題追逮,設計之初就采用了單線程模式。
    • 同步模式
      同步代碼按順序依次執(zhí)行粹舵,依次壓入調(diào)用棧進行執(zhí)行钮孵。
      • 問題:同步執(zhí)行的代碼遇到耗時操作會阻塞后續(xù)代碼,造成頁面卡死現(xiàn)象
      • 解決:耗時任務使用異步模式執(zhí)行
    • 異步模式
      解決同步耗時任務
      • 特點
        • 不會等待代碼執(zhí)行
        • 開啟任務之后會立刻繼續(xù)往后執(zhí)行
        • 后續(xù)邏輯通常使用回調(diào)函數(shù)
      • 缺點:代碼執(zhí)行順序教會換
      • 回調(diào)函數(shù)
        回調(diào)函數(shù)是異步實現(xiàn)最本質(zhì)的機制眼滤。
        • 大量回調(diào)嵌套會導致回調(diào)地域
    • 注意:JavaScript的執(zhí)行是單線程的巴席,但是瀏覽器并不是單線程,JavaScript調(diào)用的某些瀏覽器api并不是單線程的(例如計時器诅需,擁有專門的線程管理)漾唉。
  • 事件循環(huán)與消息隊列
  • 異步編程的幾種方式
  • Promise異步方案荧库、宏任務/微任務隊列
    • Promise狀態(tài)圖(Promise的狀態(tài)一經(jīng)確定就無法再做修改。)

      image
    • 解決回調(diào)地獄:借助promise的鏈式操作赵刑,盡可能將原來嵌套的回調(diào)變?yōu)楸馄交幚怼?/p>

    • 特點

      • promise對象.then返回的對象也是一個promise,且是一個新的promise
      • 后面的then方法為前面的then方法返回的promise結(jié)果注冊回調(diào)
      • then方法返回的值會成為下一個then方法的參數(shù)
      • then方法若返回一個promise分衫,后面的then方法會等待它的結(jié)束
    • 異常處理

      • promise失敗或出現(xiàn)異常會執(zhí)行onRejected注冊的回調(diào)
      • then方法的第二個參數(shù),缺點:無法捕獲到本輪then方法以及下層的異常
      • catch方法:推薦使用
    • 靜態(tài)方法

      • Promise.resolve:創(chuàng)建promise成功的方法
        • 可以將普通值快速轉(zhuǎn)換為promise對象
        • 如果傳遞的為promise般此,會將這個promise原樣返回
        • 如果傳遞的是一個對象蚪战,并且?guī)в衪hen方法,第一個參數(shù)為onFulfilled,第二個參數(shù)為onRejected铐懊,也可以被當做promise繼續(xù)向下執(zhí)行屎勘。這種對象實現(xiàn)了thenable的接口。
      • Promise.reject:創(chuàng)建promise失敗的方法
      • Promise.all([]):將多個promsie合并為一個promise居扒,所有promise均成功它才會成功
      • Promise.race([]): 多個promsie中有任意一個成功,則成功
    • Promise執(zhí)行時序

      • 異步任務可以作為宏任務去宏任務異步進行排隊丑慎,等待本輪宏任務執(zhí)行完畢再進行執(zhí)行喜喂。也可以作為當前宏任務的臨時附屬任務,加入到微任務隊列(微任務可以提高整體響應能力)竿裂,本輪同步任務執(zhí)行完畢后玉吁,先執(zhí)行本輪微任務隊列中的任務,再從宏任務隊列中取出任務執(zhí)行腻异。
      • promise的回調(diào)會作為微任務來執(zhí)行
      • 微任務:Promise, MutationObserver對象进副,Node中的process.nextTick
  • Generator異步方案、Asny/Await 語法糖
    • 生成器定義方式
      • 通過給函數(shù)添加*定義生成器函數(shù)
      • 調(diào)用一個生成器函數(shù)并不會立刻執(zhí)行函數(shù)悔常,而是會創(chuàng)建一個生成器對象
      • 直到手動調(diào)用生成器的.next()方法影斑,函數(shù)體才會開始執(zhí)行
    • yield
      • 函數(shù)體內(nèi)可以隨時通過yield關鍵詞向外返回一個值,yield關鍵詞并不會像return一樣結(jié)束函數(shù)的執(zhí)行机打,只會暫停函數(shù)的執(zhí)行矫户,直到外界繼續(xù)調(diào)用.next()方法,函數(shù)才會接著yield后面開始繼續(xù)執(zhí)行
      • 傳遞參數(shù)
        • 如果在如果在.next()方法中傳遞一個參數(shù)
        • 在yield中的返回值中會接收到傳入的參數(shù)
      • 捕獲異常
        • 如果通過throw拋出一個異常 generator.throw(new Error('error'))
        • 可以通過catch進行異常的捕獲
      • asny/await
        • 本質(zhì)残邀,genreator語法糖皆辽,相比generator優(yōu)勢為不需要額外寫執(zhí)行器。await目前只能在async函數(shù)中使用芥挣,在全局使用尚在開發(fā)中驱闷。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市空免,隨后出現(xiàn)的幾起案子空另,更是在濱河造成了極大的恐慌,老刑警劉巖蹋砚,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹换,死亡現(xiàn)場離奇詭異征字,居然都是意外死亡,警方通過查閱死者的電腦和手機娇豫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門匙姜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冯痢,你說我怎么就攤上這事氮昧。” “怎么了浦楣?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵袖肥,是天一觀的道長。 經(jīng)常有香客問我振劳,道長椎组,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任历恐,我火速辦了婚禮寸癌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弱贼。我一直安慰自己蒸苇,他們只是感情好,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布吮旅。 她就那樣靜靜地躺著溪烤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庇勃。 梳的紋絲不亂的頭發(fā)上檬嘀,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音责嚷,去河邊找鬼枪眉。 笑死,一個胖子當著我的面吹牛再层,可吹牛的內(nèi)容都是我干的贸铜。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼聂受,長吁一口氣:“原來是場噩夢啊……” “哼蒿秦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛋济,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤棍鳖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渡处,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡镜悉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了医瘫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侣肄。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡丈秩,死狀恐怖柴钻,靈堂內(nèi)的尸體忽然破棺而出吝沫,到底是詐尸還是另有隱情浆劲,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布秸苗,位于F島的核電站捞镰,受9級特大地震影響础钠,放射性物質(zhì)發(fā)生泄漏怖竭。R本人自食惡果不足惜锥债,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痊臭。 院中可真熱鬧哮肚,春花似錦、人聲如沸趣兄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艇潭。三九已至,卻和暖如春戏蔑,著一層夾襖步出監(jiān)牢的瞬間蹋凝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工总棵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鳍寂,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓情龄,卻偏偏與公主長得像迄汛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子骤视,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361