代碼1。妳做大量的計算,並把它們放在壹個js文件中。如下所示:
//job.js
onmessage?=函數?(evt){
//do?巨大的?工作。這裏妳做了很多耗時的計算。
postMessage(?數據?);//將計算結果的數據發送給主線程。
}您的頁面代碼:
& lt!DOCTYPE?HTML & gt
& lthtml & gt
& lthead & gt
& ltmeta?http-equiv="Content-Type "?content = " text/html;?charset=utf-8"/>
& lt劇本?type = " text/JavaScript " & gt;
//網頁主線程
var?工人?=新?worker(" job . js ");?//創建壹個Worker對象,並將要在新線程中執行的腳本的URL傳遞給它。
Worker.postMessage(“開始計算”);
worker.onmessage?=function(evt){//從worker接收數據函數。
console . log(evt . data);//輸出worker發來的數據,在這裏得到很多計算結果。
}
& lt/script & gt;
& lt/head & gt;
& ltbody & gt& lt/body & gt;
& lt/html & gt;場景2:對於不支持WebWorker線程的瀏覽器。
可以考慮批量處理。也就是說,創建壹個間隔計時器setInterval。
每隔壹小段時間,處理大量數據的壹部分。
這樣可以避免瀏覽器因大量計算而卡頓。
壹般代碼如下(這裏是壹個簡單的例子。具體情況具體分析。):
假設我們要計算10萬個數據的總和。
var?jobData?=?[];//假設是數組。裏面有10萬的數據。
功能?sliceJob(){
var?num?=?(jobData.length?/?100)?+?1;//將任務數據分成100份。
var?份額?=?100000;//每個副本有654.38+百萬個數字。
var?加法?=?0;//這是用來保存最終結果的。壹開始是0;
var?intv?=?setInterval(function(){
如果(數字- ){
//然後每個結果。
成癮?+=?每;
}?不然呢?{
計算最後壹份,然後輸出結果。
Alert('最終結果是:',?加法);
window . clear interval(intv);
}
},?50);
}
再說了。jQuery的延遲對象不能滿足妳的要求。
因為延遲對象的目的是串行處理異步過程。
但如果異步進程在執行的過程中耗時過長,還是會阻塞瀏覽器線程,導致瀏覽器無法運行(卡頓)。
唯壹的例外是$.ajax。ajax方法也返回壹個延遲的對象。但是,因為異步進程使用的是XMLHttpRequest。Xhr默認異步執行,相當於啟動另壹個線程,所以不會阻塞瀏覽器郡。