轉(zhuǎn)帖|其它|編輯:郝浩|2011-03-21 13:30:00.000|閱讀 622 次
概述:在之前的文章中,我們講了瀏覽器對于JavaScript代碼執(zhí)行的限制和基于計時器的偽線程機(jī)制。這里,我們再看看如何在JavaScript中處理大量數(shù)據(jù)。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在幾年之前,開發(fā)人員不會去考慮在服務(wù)端之外處理大量的數(shù)據(jù)。現(xiàn)在這種觀念已經(jīng)改變了,很多Ajax程序需要在客戶端和服務(wù)器端傳輸大量的數(shù)據(jù)。此外,更新DOM節(jié)點的處理在瀏覽器端來看也是一個很耗時的工作。而且,需要對這些信息進(jìn)行分析處理的時候也很可能導(dǎo)致程序無響應(yīng),瀏覽器拋出錯誤。
將需要大量處理數(shù)據(jù)的過程分割成很多小段,然后通過JavaScript的計時器來分別執(zhí)行,就可以防止瀏覽器假死。先看看怎么開始:
function ProcessArray(data,handler,callback){ProcessArray()方法支持三個參數(shù):
1、data:需要處理的數(shù)據(jù)
2、handler:處理每條數(shù)據(jù)的函數(shù)
3、callback:回調(diào)函數(shù)
然后定義一些變量:
var maxtime = 100;maxtime表示每個處理進(jìn)程的最大毫秒數(shù)。delay表示每個程序塊之間的毫秒數(shù)。queue是源數(shù)據(jù)的復(fù)制,雖然不是在所有情景下都必要,但是我們是通過傳遞引用修改的,所以最好還是備份一下。
然后就可以使用setTimeout()方法來處理了:
setTimeout(function(){首先,先計算endtime,這是程序處理的最大時間。do.while 循環(huán)用來處理每一個小塊的數(shù)據(jù),直到循環(huán)全部完成或者超時。
為什么使用do..while循環(huán)呢?
JavaScript支持while和do…while循環(huán)。不同之處在于do..while循環(huán)回至少執(zhí)行一次。如果使用while循環(huán),那么當(dāng)開發(fā)者設(shè)置一個很小或者很低的endtime值的時候,那么處理就根本不會執(zhí)行了。
最后,我們再決定是否需要處理其他的數(shù)據(jù),如果需要,那么就再調(diào)用一次:
if (queue.length > 0) {這樣回調(diào)函數(shù)會在每一個數(shù)據(jù)都處理結(jié)束的時候執(zhí)行。我們可以通過ProcessArray()來測試一小組數(shù)據(jù):
// process an individual data item這個方法在任何瀏覽器中都可以執(zhí)行,不過HTML5提供了更好的辦法,Rockux在以后的文章中會提到。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:RockUX