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

Vue 源碼思想在工作中的應用

開發 前端
由于電腦CPU、內存等的限制,能夠同時啟動的任務數有一定限制,例如一臺電腦能夠執行5個異步任務,但是目前有100個異步任務要執行,那么如何讓這100個任務無間隔的快速執行完畢呢?

 [[432966]]

一、背景

由于電腦CPU、內存等的限制,能夠同時啟動的任務數有一定限制,例如一臺電腦能夠執行5個異步任務,但是目前有100個異步任務要執行,那么如何讓這100個任務無間隔的快速執行完畢呢?

二、問題解答

剛遇到這個問題的時候,也是出于懵逼狀態,怎么處理呢???碰巧的是近期學習了一些Vue的源碼知識,那么是不是可以借鑒其思想來解決遇到的這個難題呢?經過一步步分析,確定答案是肯定的。下面從解題思路、知識點及代碼實現來聊一聊實現過程。

2.1 解題思路

上述是整個流程圖,其流程可簡化為以下幾個步驟:

將所有任務分為兩組,任務組1指的是電腦可以并行執行的異步任務,任務組2指的是其余的異步任務;

將任務組1變為可幀聽狀態,即其發生變化時我們能夠知道;

將任務組1中的任務觸發(不觸發任務不會執行);

某一任務執行完畢后,將任務組2中的一個任務填充到可幀聽狀態的任務組1中;

任務按照固定數量不斷執行,直到所有任務執行完畢。

2.2 知識點

在Vue源碼中,Vue2.x使用Object.defineProperty()實現對數據的幀聽;Vue3.0使用Proxy實現對數據的幀聽。本著趕時髦和Proxy確實優秀的態度,在實現過程中也應用了Proxy。Proxy作為一個新的知識點,先了解一下其定義及使用方法。

2.2.1 定義

Proxy中文意思是“代理”,是在目標對象之間架設一層“攔截”,從而可以修改某些操作的默認行為。Proxy共支持十三種攔截操作:get、set、has、deleteProperty、ownKeys、getOwnPropertyDescriptor、defineProperty、preventExtensions、getPrototypeOf、isExtensible、setPrototypeOf、apply、construct。

2.2.2 簡單使用

  1. function testProxy(obj) { 
  2.     return new Proxy(obj, { 
  3.         get: (target, key) => { 
  4.             console.log(`我被get攔截器攔截了,攔截的屬性是${key}`); 
  5.         }, 
  6.         set: (target, key, value) => { 
  7.             console.log(`我被set攔截器攔截了,攔截的屬性是${key}, 新值是${value}`); 
  8.             target[key] = value; 
  9.         } 
  10.     }); 
  11.  
  12. const testObj = { 
  13.     a: 10 
  14. }; 
  15. const proxy = testProxy(testObj); 
  16.  
  17. proxy.a = 100; 

2.2.3 詳細使用

詳細用法可以參考阮一峰大佬的“ECMAScript 6入門”。

2.3 代碼實現

2.3.1 定義兩個任務隊列

首先定義兩個任務隊列,task1為開始執行的一批任務,task2中為后續添加進去的任務。

  1. const task1 = [1, 2, 3]; 
  2. const task2 = [4, 5, 6, 7, 8]; 

2.3.2 數據變為可幀聽的函數

利用Proxy將數據變為可幀聽狀態

  1. /** 
  2.  * 監聽模塊,監聽對應數組的變化,保證其始終有一定長度的內容在運行 
  3.  * 
  4.  * @param {Array} initArr 定長任務的數組 
  5.  * @param {Function} callback 對應的回調函數 
  6.  */ 
  7. function watcher(initArr, callback) { 
  8.     const proxy = new Proxy(initArr, { 
  9.         set(target, key, value, receiver) { 
  10.             target[key] = value; 
  11.             callback(value, key, receiver); 
  12.         } 
  13.     }); 
  14.     return proxy; 

2.3.3 異步任務邏輯

  1. /** 
  2.  * 異步任務的運行邏輯 
  3.  * 
  4.  * @param {number} taskIndex 異步任務的序號 
  5.  * @param {number} index 當前任務在定長任務的序號 
  6.  * @param {Proxy} proxy Proxy實例 
  7.  */ 
  8. function asyncTask(taskIndex, index, proxy) { 
  9.     console.log(`${index}索引處的任務${taskIndex}開始執行`); 
  10.     return new Promise(resolve => { 
  11.         setTimeout(() => { 
  12.             console.log(`${index}索引處的任務${taskIndex}執行完畢`); 
  13.             // 當任務隊列2中還有任務時,進入隊列替換任務1中執行完的任務 
  14.             if (task2.length > 0) { 
  15.                 proxy[index] = task2.shift(); 
  16.             } 
  17.         }, 1000 + 2000 * Math.random()); 
  18.     }); 

2.3.4 主函數

  1.     const proxy = watcher(task1, asyncTask); 
  2.     task1.forEach((taskIndex, index) => asyncTask(taskIndex, index, proxy)); 

2.3.5 執行結果

通過結果可以看到,當一個任務完成時立刻將有一個新的任務進入。

  1. 0索引處的任務1開始執行 
  2. 1索引處的任務2開始執行 
  3. 2索引處的任務3開始執行 
  4. 0索引處的任務1執行完畢 
  5. 0索引處的任務4開始執行 
  6. 2索引處的任務3執行完畢 
  7. 2索引處的任務5開始執行 
  8. 1索引處的任務2執行完畢 
  9. 1索引處的任務6開始執行 
  10. 0索引處的任務4執行完畢 
  11. 0索引處的任務7開始執行 
  12. 2索引處的任務5執行完畢 
  13. 2索引處的任務8開始執行 
  14. 1索引處的任務6執行完畢 
  15. 0索引處的任務7執行完畢 
  16. 2索引處的任務8執行完畢 

三、討論

針對此類問題的處理方式,各位大佬有新的思路與方法歡迎留言,我們一起討論,共同進步。

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

 

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

2022-05-12 13:50:13

OOPTCC中間件

2024-04-15 00:10:00

Redis數據庫

2019-12-11 15:21:12

PythonExcel瀏覽器

2024-11-25 09:08:10

Redis高頻應用場景

2021-12-31 08:44:11

CSS 技巧代碼重構

2024-02-28 07:53:30

Redis數據存儲數據庫

2019-08-07 16:50:38

SQLjoingroup

2021-04-14 17:34:18

線程安全

2025-05-27 07:00:00

AI工具GenAI人工智能

2022-09-30 09:26:35

JavaScript技巧

2022-09-25 22:56:52

JavaScrip編程技巧

2023-04-25 12:35:38

2021-06-07 14:36:58

iPadSiri辦公

2023-04-13 10:51:42

2019-04-26 14:11:56

技巧工程師實踐

2021-07-15 08:12:31

體系感面試邏輯思維

2021-04-18 21:07:32

門面模式設計

2021-05-26 10:24:13

智能技術物聯網IOT

2009-01-18 16:08:30

數據倉庫商務智能數據提取層

2017-05-14 16:44:03

大數據地方審計審計數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品高潮呻吟久久 | 国产精品美女 | 中文字幕一级毛片视频 | 夜夜夜久久久 | 五月综合久久 | 狠狠色综合久久丁香婷婷 | 亚洲精品乱码久久久久久按摩观 | 亚洲精品一区二区在线观看 | 色婷婷国产精品 | 日本特黄a级高清免费大片 成年人黄色小视频 | 久久国产精品99久久久久久丝袜 | 日本天天操 | 国内精品久久久久久 | 国产精品久久久久久久久久东京 | 极品销魂美女一区二区 | 国产成人精品免费视频大全最热 | 久久久久久久久久性 | 免费网站国产 | 一区二区三区久久久 | 日本免费在线看 | 男女网站在线观看 | 欧美亚洲国产精品 | com.国产| 日韩午夜| 永久网站| 亚洲一区国产 | 亚洲国产一区二区三区在线观看 | 国产欧美精品 | 亚洲成av人影片在线观看 | 无码日韩精品一区二区免费 | 午夜视频精品 | 日韩一区二区三区在线观看 | 91免费观看国产 | 亚洲免费影院 | 日韩欧美不卡 | 久久三区 | 亚洲精品中文在线观看 | 一区二区三区成人 | 国产福利在线小视频 | 国产中文视频 | 韩国久久 |