如何在JavaScript中處理大量數據

來源: RockUX  發布時間: 2011-03-20 20:37  閱讀: 5093 次  推薦: 1   原文鏈接   [收藏]  
摘要:這里,我們看看如何瀏覽器對于JavaScript中處理大量數據。

  在之前的文章中,我們講了瀏覽器對于JavaScript代碼執行的限制和基于計時器的偽線程機制。這里,我們再看看如何在JavaScript中處理大量數據。

  在幾年之前,開發人員不會去考慮在服務端之外處理大量的數據。現在這種觀念已經改變了,很多Ajax程序需要在客戶端和服務器端傳輸大量的數據。此外,更新DOM節點的處理在瀏覽器端來看也是一個很耗時的工作。而且,需要對這些信息進行分析處理的時候也很可能導致程序無響應,瀏覽器拋出錯誤。

  將需要大量處理數據的過程分割成很多小段,然后通過JavaScript的計時器來分別執行,就可以防止瀏覽器假死。先看看怎么開始:

 
function ProcessArray(data,handler,callback){

  ProcessArray()方法支持三個參數:

  • data:需要處理的數據
  • handler:處理每條數據的函數
  • callback:回調函數

  然后定義一些變量:

 
var maxtime = 100;
var delay = 20;
var queue = data.concat();

  maxtime表示每個處理進程的最大毫秒數。delay表示每個程序塊之間的毫秒數。queue是源數據的復制,雖然不是在所有情景下都必要,但是我們是通過傳遞引用修改的,所以最好還是備份一下。

  然后就可以使用setTimeout()方法來處理了:

 
setTimeout(function(){
var endtime = new Date() + maxtime;
do{
hanler(queue.shift());
}
while(queue.length>0 && endtime > new Date());

  首先,先計算endtime,這是程序處理的最大時間。do.while 循環用來處理每一個小塊的數據,直到循環全部完成或者超時。

  為什么使用do..while循環呢?
  JavaScript支持while和do…while循環。不同之處在于do..while循環回至少執行一次。如果使用while循環,那么當開發者設置一個很小或者很低的endtime值的時候,那么處理就根本不會執行了。

  最后,我們再決定是否需要處理其他的數據,如果需要,那么就再調用一次:

 
if (queue.length > 0) {
setTimeout(arguments.callee, delay);
}

else {
if (callback) callback();
}
}, delay);
}

  這樣回調函數會在每一個數據都處理結束的時候執行。我們可以通過ProcessArray()來測試一小組數據:

 
// process an individual data item
function Process(dataitem) {
console.log(dataitem);
}

// processing is complete
function Done() {
console.log(
"Done");
}

// test data
var data = [];
for (var i = 0; i < 500; i++) data[i] = i;
// process all items
ProcessArray(data, Process, Done);

  這個方法在任何瀏覽器中都可以執行,不過HTML5提供了更好的辦法,Rockux在以后的文章中會提到。

1
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()