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

詳解JavaScript之分解任務

開發 前端
我們都知道,復雜的任務分解成一系列的子任務之后,就變得不是很復雜了。javascript中也存在這種任務分解,本文詳細的介紹JavaScript中的分解任務,希望對你有幫助,一起來看。

下面來看,JavaScript分解任務,供參考。

我們通常將一個任務分解成一系列子任務。如果一個函數運行時間太長,那么查看它是否可以分解成一系列能夠短時間完成的較小的函數。可將一行代碼簡單地看作一個原子任務,多行代碼組合在一起構成一個獨立任務。某些函數可基于函數調用進行拆分。例如:

  1. function saveDocument(id){  
  2. openDocument(id)  
  3. writeText(id);  
  4. closeDocument(id);  
  5. updateUI(id);  

如果函數運行時間太長,它可以拆分成一系列更小的步驟,把獨立方法放在定時器中調用。你可以將每個函數都放入一個數組,然后使用前一節中提到的數組處理模式:

  1. function saveDocument(id){  
  2. var tasks = [openDocument, writeText, closeDocument, updateUI];  
  3. setTimeout(function(){  
  4. var task = tasks.shift();  
  5. task(id);  
  6. if (tasks.length > 0){  
  7. setTimeout(arguments.callee, 25);  
  8. }  
  9. }, 25);  

這個版本將每個方法放入任務數組,然后在每個定時器中調用一個方法。從根本上說,現在它成為數組處理模式,只有一點不同:處理函數就包含在數組項中。正如前面一節所討論的,此模式也可封裝重用:

  1. function multistep(steps, args, callback){  
  2. var tasks = steps.concat();  
  3. setTimeout(function(){  
  4. var task = tasks.shift();  
  5. task.apply(null, args || []);  
  6. if (tasks.length > 0){  
  7. setTimeout(arguments.callee, 25);  
  8. else {  
  9. callback();  
  10. }  
  11. }, 25);  

multistep()函數接收三個參數:用于執行的函數數組,為每個函數提供參數的參數數組,當處理結束時調用的回調函數。函數用法如下:

  1. function saveDocument(id){  
  2. var tasks = [openDocument, writeText, closeDocument, updateUI];  
  3. multistep(tasks, [id], function(){  
  4. alert("Save completed!");  
  5. });  

注意傳給multistep()的第二個參數必須是數組,它創建時只包含一個id。正如數組處理那樣,使用此函數的前提條件是:任務可以異步處理而不影響用戶體驗或導致依賴代碼出錯。

(一)限時運行代碼

有時每次只執行一個任務效率不高。考慮這樣一種情況:處理一個擁有1'000個項的數組,每處理一個項需要1毫秒。如果每個定時器中處理一個項,在兩次處理之間間隔25毫秒,那么處理此數組的總時間是(25 + 1) × 1'000 = 26'000 秒,也就是26 秒。如果每批處理50個,每批之間間隔25毫秒會怎么樣呢?整個處理過程變成(1'000 / 50) × 25 + 1'000 = 1'500毫秒,也就是1.5秒,而且用戶也不會察覺界面阻塞,因為最長的腳本運行只持續了50毫秒。通常批量處理比每次處理一個更快。

如果你記住JavaScript可連續運行的最大時間是100毫秒,那么你可以優化先前的模式。我的建議是將這個數字削減一半,不要讓任何JavaScript代碼持續運行超過50毫秒,只是為了確保代碼永遠不會影響用戶體驗。

可通過原生的Date 對象跟蹤代碼的運行時間。這是大多數JavaScript分析工具所采用的工作方式:

  1. var start = +new Date(),  
  2. stop;  
  3. someLongProcess();  
  4. stop = +new Date();  
  5. if(stop-start < 50){  
  6. alert("Just about right.");  
  7. else {  
  8. alert("Taking too long.");  

 

由于每個新創建的Data 對象以當前系統時間初始化,你可以周期性地創建新Data對象并比較它們的值,以獲取代碼運行時間。加號(+)將Data 對象轉換為一個數字,在后續的數學運算中就不必再轉換了。這一技術也可用于優化以前的定時器模板。
processArray()方法通過一個時間檢測機制,可在每個定時器中執行多次處理:

  1. function timedProcessArray(items, process, callback){  
  2. var todo = items.concat();  
  3. setTimeout(function(){  
  4. var start = +new Date();  
  5. do {  
  6. process(todo.shift());  
  7. while (todo.length > 0 && (+new Date() – start < 50));  
  8. if (todo.length > 0){  
  9. setTimeout(arguments.callee, 25);  
  10. else {  
  11. callback(items);  
  12. }  
  13. }, 25);  

此函數中添加了一個do-while循環,它在每個數組項處理之后檢測時間。定時器函數運行時數組中存放了至少一個項,所以后測試循環比前測試更合理。在Firefox 3中,如果process()是一個空函數,處理一個1'000個項的數組需要38 – 34毫秒;原始的processArray()函數處理同一個數組需要超過25'000毫秒。這就是定時任務的作用,避免將任務分解成過于碎小的片斷。

(二)定時器與性能

定時器使你的JavaScript代碼整體性能表現出巨大差異,但過度使用它們會對性能產生負面影響。使用定時器序列,同一時間只有一個定時器存在,只有當這個定時器結束時才創建一個新的定時器。以這種方式使用定時器不會帶來性能問題。

當多個重復的定時器被同時創建會產生性能問題。因為只有一個UI線程,所有定時器競爭運行時間。Google Mobile的Neil Thomas 將此問題作為測量性能的方法進行研究,針對iPhone和Android上運行的移動Gmail程序。

Thomas發現低頻率的重復定時器——間隔在1 秒或1 秒以上——幾乎不影響整個網頁應用的響應。這種情況下定時器延遲遠超過使UI 線程產生瓶頸的值,因此可安全地重復使用。當多個重復定時器使用更高的頻率(間隔在100到200毫秒之間),Thomas發現移動Gmail程序明顯變慢,反應較差。

Thomas研究的言外之意是,要在你的網頁應用中限制高頻率重復定時器的數量。同時,Thomas建議創建一個單獨的重復定時器,每次執行多個操作。

原文地址: http://www.yiiyaa.net/1223

【編輯推薦】

  1. JavaScript重構 模塊劃分和命名空間
  2. JavaScript初學者必須注意的七個細節
  3. Javascript中的函數聲明和函數表達式
  4. 在服務端合并和壓縮JavaScript和CSS文件
  5. 學習Javascript閉包(Closure)
責任編輯:于鐵 來源: yiiyaa.net
相關推薦

2020-04-15 09:20:08

數據護欄行為分析數據庫安全

2020-09-29 19:20:05

鴻蒙

2020-11-06 12:12:35

HarmonyOS

2009-11-12 16:41:36

路由器產品

2021-11-10 16:10:18

鴻蒙HarmonyOS應用

2021-06-29 20:51:16

大數據框架分桶

2011-08-04 13:38:01

Objective-C C++

2012-02-14 09:45:02

JavaScript

2023-04-06 00:22:19

JavaScrip任務開發

2012-06-05 08:59:35

Hadoop架構服務器

2020-12-29 08:21:03

JavaScript微任務宏任務

2016-10-11 20:33:17

JavaScriptThisWeb

2014-12-12 10:13:12

JavaScript

2013-05-08 10:36:07

JavaScriptJS詳解JavaScrip

2016-09-07 20:43:36

Javascript異步編程

2025-05-21 08:52:00

2021-01-18 08:24:51

JavaScriptMicrotask微任務

2025-05-27 15:35:02

大模型技術AI

2023-01-03 10:38:04

函數計算技術

2011-03-28 09:23:31

Visual Stud
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美中文字幕在线观看 | 国产精品色 | avhd101在线成人播放 | 狠狠入ady亚洲精品经典电影 | 国产高清视频 | 天天干天天爱天天爽 | 国产精品视频在线观看 | 日韩成人在线播放 | 91综合在线视频 | 波多野结衣亚洲 | 99精品视频在线观看免费播放 | 99精品国产一区二区青青牛奶 | 天天拍天天操 | 国产欧美一区二区三区在线看 | 国产视频一区二区三区四区五区 | 91视频网址 | 国产成在线观看免费视频 | 欧美精选一区二区 | 国产色在线 | 国产亚洲精品久久久久动 | 成人亚洲片 | 亚洲性视频 | 久久国产精品免费一区二区三区 | 欧洲亚洲精品久久久久 | 国产精品无码永久免费888 | 欧美一级一区 | 国产一级一片免费播放 | 91在线精品一区二区 | 激情毛片| 精品在线一区 | 中文字幕在线视频免费视频 | 免费成人av网站 | 国产一区二区精品在线观看 | 午夜激情影院 | 亚洲综合五月天婷婷 | 97色在线观看免费视频 | 国产精品资源在线 | 久久久久久成人 | 免费小视频在线观看 | 欧美一级免费 | 国产在线看片 |