成人免费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技巧

2021-06-07 14:36:58

iPadSiri辦公

2022-09-25 22:56:52

JavaScrip編程技巧

2023-04-25 12:35:38

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

2017-05-14 16:44:03

大數據地方審計審計數據

2024-12-17 08:20:50

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 本道综合精品 | 欧美日日日日bbbbb视频 | 国产美女特级嫩嫩嫩bbb片 | 99亚洲精品 | 91精品久久久 | 国产精品一区二区av | 中文字幕 在线观看 | 亚洲最新在线视频 | 免费激情网站 | 在线观看免费av网 | 欧美中文字幕在线观看 | 超碰免费在线 | 久久久国产一区二区三区 | 成人亚洲精品久久久久软件 | 欧日韩在线观看 | 久久成人一区二区三区 | 色婷婷综合在线观看 | 久久久www成人免费无遮挡大片 | 国产精品成人免费 | 国产偷录叫床高潮录音 | 免费激情 | 武道仙尊动漫在线观看 | 狠狠狠| 国产精品国产成人国产三级 | 亚洲在线一区 | 99爱在线观看| 中文字幕在线精品 | 在线观看亚洲专区 | 国产一区免费 | 日本不卡一区二区 | 九九精品久久久 | 亚洲日本成人 | 国产精品久久久久久久久久久新郎 | 国产一二区免费视频 | 一区二区三区精品视频 | 久久噜 | 久草热视频 | 国产精品久久久久久久久 | 欧美精品影院 | 在线观看国产三级 | 欧美乱码精品一区二区三区 |