js 異步全覽

概覽

問題助琐!

  • JS 為什么是單線程的?
  • 為什么需要異步?
  • 單線程又是如何實現(xiàn)異步的呢?
  • promise 的優(yōu)點是什么宋距?
  • 如何手動實現(xiàn)一個 Promise沥匈?
  • async 做一件什么事情碟狞?
  • await 在等什么律罢?
  • await 等到之后耕姊,做了一件什么事情桶唐?
  • async/await 比 promise 有哪些優(yōu)勢?

js 是單線程的

js 是單線程的茉兰,所謂單線程尤泽,是指在 JS 引擎中負責解釋和執(zhí)行 JavaScript 代碼的線程只有一個, 有且只有一個調(diào)用棧,每次只能做一件事规脸, 同一時間只能做一件事坯约,瀏覽器渲染和 js 共用一個線程,不妨叫它主線程莫鸭。之所以設(shè)計成這樣是為了避免 dom 渲染的沖突闹丐。

但是實際上還存在其他的線程。例如:處理 AJAX 請求的線程被因、處理 DOM 事件的線程妇智、定時器線程、讀寫文件的線程(例如在 Node.js 中)等等氏身。這些線程可能存在于 JS 引擎之內(nèi)巍棱,也可能存在于 JS 引擎之外,在此我們不做區(qū)分蛋欣。不妨叫它們工作線程航徙。

但是 js 是需要異步操作的,比如 ajax 請求

通過 event loop 實現(xiàn)異步

為了支持異步操作陷虎,通過 event loop(事件循環(huán)到踏,事件輪詢)這種機制來實現(xiàn)異步
瀏覽器的 Event Loop 遵循的是 HTML5 標準,而 NodeJs 的 Event Loop 遵循的是 libuv尚猿。

任務(wù)隊列

Js 中窝稿,有兩類任務(wù)隊列:宏任務(wù)隊列(macro tasks)和微任務(wù)隊列(micro tasks)。宏任務(wù)隊列可以有多個凿掂,微任務(wù)隊列只有一個伴榔。那么什么任務(wù)纹蝴,會分到哪個隊列呢?

宏任務(wù):script(全局任務(wù)), setTimeout, setInterval, setImmediate, I/O, UI rendering.
微任務(wù):process.nextTick, Promise, Object.observer, MutationObserver.

瀏覽器的執(zhí)行流程

當 call stack 空的時候踪少,就會從任務(wù)隊列中塘安,取任務(wù)來執(zhí)行。瀏覽器這邊援奢,共分 3 步:

取一個宏任務(wù)來執(zhí)行兼犯。執(zhí)行完畢后,下一步集漾。
取一個微任務(wù)來執(zhí)行切黔,執(zhí)行完畢后,再取一個微任務(wù)來執(zhí)行具篇。直到微任務(wù)隊列為空绕娘,執(zhí)行下一步。
更新 UI 渲染栽连。

Event Loop 會無限循環(huán)執(zhí)行上面 3 步险领,這就是 Event Loop 的主要控制邏輯。其中秒紧,第 3 步(更新 UI 渲染)會根據(jù)瀏覽器的邏輯绢陌,決定要不要馬上執(zhí)行更新。畢竟更新 UI 成本大熔恢,所以脐湾,一般都會比較長的時間間隔,執(zhí)行一次更新叙淌。

測試

這是一道去年「今日頭條」的面試題秤掌,試著看一下它的執(zhí)行流程

async function async1() {
  console.log("async1 start");
  await async2();
  console.log("async1 end");
}

async function async2() {
  console.log("async2");
}

console.log("script start");

setTimeout(function() {
  console.log("setTimeout");
}, 0);

async1();

new Promise(function(resolve) {
  console.log("promise1");
  resolve();
}).then(function() {
  console.log("promise2");
});

console.log("script end");

(未完待續(xù)...)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鹰霍,隨后出現(xiàn)的幾起案子闻鉴,更是在濱河造成了極大的恐慌,老刑警劉巖茂洒,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孟岛,死亡現(xiàn)場離奇詭異,居然都是意外死亡督勺,警方通過查閱死者的電腦和手機渠羞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來智哀,“玉大人次询,你說我怎么就攤上這事〈山校” “怎么了屯吊?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵送巡,是天一觀的道長。 經(jīng)常有香客問我雌芽,道長,這世上最難降的妖魔是什么辨嗽? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任世落,我火速辦了婚禮,結(jié)果婚禮上糟需,老公的妹妹穿的比我還像新娘屉佳。我一直安慰自己,他們只是感情好洲押,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布武花。 她就那樣靜靜地躺著,像睡著了一般杈帐。 火紅的嫁衣襯著肌膚如雪体箕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天挑童,我揣著相機與錄音累铅,去河邊找鬼。 笑死站叼,一個胖子當著我的面吹牛娃兽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尽楔,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼投储,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阔馋?” 一聲冷哼從身側(cè)響起玛荞,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呕寝,沒想到半個月后冲泥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡壁涎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年凡恍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怔球。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚼酝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竟坛,到底是詐尸還是另有隱情闽巩,我是刑警寧澤钧舌,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站涎跨,受9級特大地震影響洼冻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隅很,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一撞牢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叔营,春花似錦屋彪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婴谱,卻和暖如春蟹但,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谭羔。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工矮湘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人口糕。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓缅阳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親景描。 傳聞我的和親對象是個殘疾皇子十办,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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