- 同步模式與異步模式
- 單線程
最初設計為瀏覽器腳本,用于操作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.resolve:創(chuàng)建promise成功的方法
-
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ā)中驱闷。
- 生成器定義方式
拉勾前端學習-模塊一-JavaScript異步編程
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門匙姜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冯痢,你說我怎么就攤上這事氮昧。” “怎么了浦楣?”我有些...
- 文/不壞的土叔 我叫張陵袖肥,是天一觀的道長。 經(jīng)常有香客問我振劳,道長椎组,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任历恐,我火速辦了婚禮寸癌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弱贼。我一直安慰自己蒸苇,他們只是感情好,可當我...
- 文/花漫 我一把揭開白布吮旅。 她就那樣靜靜地躺著溪烤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪庇勃。 梳的紋絲不亂的頭發(fā)上檬嘀,一...
- 文/蒼蘭香墨 我猛地睜開眼聂受,長吁一口氣:“原來是場噩夢啊……” “哼蒿秦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛋济,我...
- 正文 年R本政府宣布秸苗,位于F島的核電站捞镰,受9級特大地震影響础钠,放射性物質(zhì)發(fā)生泄漏怖竭。R本人自食惡果不足惜锥债,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痊臭。 院中可真熱鬧哮肚,春花似錦、人聲如沸趣兄。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽艇潭。三九已至,卻和暖如春戏蔑,著一層夾襖步出監(jiān)牢的瞬間蹋凝,已是汗流浹背。 一陣腳步聲響...