成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端百題斬之兩個角度一個實戰了解事件循環

開發 項目管理
不進入主線程,而進入“任務隊列”的任務,只有“任務隊列”通知主進程,某個異步任務可以執行了,該任務才會進入主線程執行。

[[438009]]

9.1 任務分類

9.1.1 廣義分類

從廣義的角度來看,任務主要分為兩種:同步任務、異步任務。

同步任務

在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行后一個任務。

異步任務

不進入主線程,而進入“任務隊列”的任務,只有“任務隊列”通知主進程,某個異步任務可以執行了,該任務才會進入主線程執行。(注:異步任務解決的是性能問題)

拓展一下:為什么會存在異步任務?

因為js是單線程的,如果只有同步任務,所有任務都是在單線程中執行的,所以每次只能執行一個任務,而其它任務都處于等待狀態,從而造成下一個任務等待較長時間,通過異步任務就可以很好的解決這個問題。

9.1.2 精確分類

除了廣義上同步任務和異步任務這種分類外,其實有更加精確的分類:宏任務和微任務。

宏任務

宏任務主要指的是任務隊列中的這些任務,主要包含以下幾類:

(1)整體script代碼

(2)setTimeout

(3)setInterval

(4)setImmediate(Node獨有)

(5)I/O

微任務

微任務就是一個需要異步執行的函數,執行時機是在主函數執行結束之后、當前宏任務結束之前,主要包含以下幾類:(注:微任務解決的是實時性問題)

(1)process.nextTick(Node獨有)

將callback添加到下一個時間點的隊列;

(2)MutationObserver

使用MutationObserver監控某個DOM節點,當DOM節點發生變化時,就會產生DOM變化記錄的微任務。

(3)Promise以及以Promise為基礎開發出來的其它技術(注意:當調用Prommise.resolve()或者Promise.reject()的時候也會產生微任務)

擴展一下:為什么需要微任務?它解決了什么問題?

如果不存在微任務,將所有的操作按照同一優先級順序執行,會造成一些高優先級任務的實時性問題,所以才會出現微任務,通過將對實時性要求較高的任務放到微任務隊列中,從而保證高優先級任務的實時性要求。

9.2 事件循環流程

JS使用單線程的“事件循環(Event Loop)”來處理多個任務的執行,下面從兩個角度來解釋整個流程。

9.2.1 同步和異步角度

從同步和異步任務的角度來看,整個事件循環流程可分為以下步驟:

同步和異步任務分別進入不同的執行場所,同步的進入主線程,異步的進入Event Table并注冊函數;

當指定的事情完成是,Event Table會將這個函數移入Event Queue;

主線程的任務執行完畢為空是,會去Event Queue讀取對應的函數,進入主線程執行;

上述過程會不斷重復,也就是常熟的Event Loop(事件循環)。

cmd-markdown-logo

注:該圖來源于網絡

9.2.2 宏任務和微任務角度

從宏任務和微任務角度來看,整個事件循環機制可分為以下步驟:

獲取一個宏任務開始執行,在執行時先創建一個微任務隊列,當遇到微任務的時候將微任務放到微任務隊列;

接著獲取微任務隊列中的所有微任務,然后依次執行(注:在執行微任務的時候產生的微任務將放到微任務的隊列的尾部,在本次循環中執行完畢)

循環執行該過程。

9.3 實戰

事件循環的核心內容就是需要區分清楚任務類型,只要將任務類型劃分好之后按照順序依次執行即可,下面用一段代碼演示以下整個的輸出內容。

  1. console.log('start'); 
  2.  
  3. setTimeout(function() { 
  4.     console.log('setTimeout1'); 
  5.     const promise2 = new Promise((resolve, reject) => { 
  6.         console.log('promise2'); 
  7.         resolve(); 
  8.     }); 
  9.  
  10.     promise2.then(() => { 
  11.         console.log('then2'); 
  12.         const promise3 = new Promise(resolve => { 
  13.             console.log('promise3'); 
  14.             resolve(); 
  15.         }); 
  16.         promise3.then(() => { 
  17.             console.log('then3'); 
  18.         }); 
  19.     }); 
  20. }, 1000); 
  21.  
  22. setTimeout(function() { 
  23.     console.log('setTimeout2'); 
  24.     const promise4 = new Promise((resolve, reject) => { 
  25.         console.log('promise4'); 
  26.         resolve(); 
  27.     }); 
  28.  
  29.     promise4.then(() => { 
  30.         console.log('then4'); 
  31.     }); 
  32. }, 1000); 
  33. const promise1 = new Promise(resolve => { 
  34.     console.log('promise1'); 
  35.     resolve(); 
  36. }); 
  37.  
  38. promise1.then(() => { 
  39.     console.log('then1'); 
  40. }); 
  41.  
  42. console.log('end'); 

只要了解整個事件循環機制,很容易可以得出答案,答案如下所示:

  1. start 
  2. promise1 
  3. end 
  4. then1 
  5. setTimeout1 
  6. promise2 
  7. then2 
  8. promise3 
  9. then3 
  10. setTimeout2 
  11. promise4 
  12. then4 

本文轉載自微信公眾號「前端點線面」,可以通過以下二維碼關注。轉載本文請聯系前端點線面公眾號。

 

責任編輯:武曉燕 來源: 前端點線面
相關推薦

2021-07-29 06:56:35

前端事件循環

2021-08-04 06:56:49

HTTP緩存前端

2021-10-19 22:23:05

typeof方式Instanceof

2021-05-09 22:00:59

TypeofInstanceof運算符

2020-11-13 07:16:09

線程互斥鎖死循環

2021-06-07 07:01:43

js關鍵字運行

2021-06-28 07:12:28

賦值淺拷貝深拷貝

2021-05-12 07:04:55

Js變量方式

2021-07-05 07:02:33

前端跨域策略

2021-07-26 06:57:58

重繪回流前端

2021-05-19 07:02:42

JS對象方法

2021-06-09 07:01:30

前端CallApply

2021-05-30 19:02:59

變量對象上下文

2021-11-03 06:57:41

瀏覽器Jsonp安全

2021-12-03 06:59:23

操作符驗證點屬性

2021-07-08 07:01:53

瀏覽器安全前端

2021-10-18 09:01:01

前端賦值淺拷貝

2021-07-14 07:00:53

瀏覽器技巧前端

2021-08-02 06:49:46

HTTP網絡模型

2010-04-28 12:11:39

網絡負載均衡
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品亚洲91 | 亚洲久久一区 | 91精品国产色综合久久 | 中文字幕久久久 | 国产精品一区二区久久 | 欧美国产精品一区二区 | www.狠狠干 | 一级毛毛片 | 全免费a级毛片免费看视频免 | www.一区二区三区 | 日韩三级 | 日韩精品久久一区二区三区 | 日韩一区二区三区在线 | 久久伊人精品一区二区三区 | 亚洲视频一区二区 | 九色视频网站 | 狠狠躁夜夜躁人人爽天天高潮 | 国产一区二区三区免费观看视频 | 久久人体视频 | 日韩电影免费在线观看中文字幕 | 久久久久久免费看 | 香蕉一区二区 | 天堂一区二区三区四区 | 91精品国产欧美一区二区 | 久久综合伊人一区二区三 | aaa在线| 黄色片a级 | 黑人精品欧美一区二区蜜桃 | 久久三区| 午夜视频在线观看一区二区 | 欧美一级特黄aaa大片在线观看 | 日韩欧美国产精品一区二区三区 | 亚洲精品免费在线 | 日本一区视频在线观看 | 中文字幕一区二区三区日韩精品 | 免费观看一级特黄欧美大片 | 亚洲免费视频在线观看 | 伊人伊人| 天天干天天色 | 日本在线观看网址 | 久久久久久免费精品一区二区三区 |