當前位置:成語大全網 - 書法字典 - js在執行壹個耗時的操作,比如大遍歷的時候,如何真正做到異步,讓瀏覽器界面不會假死?

js在執行壹個耗時的操作,比如大遍歷的時候,如何真正做到異步,讓瀏覽器界面不會假死?

Scheme 1:對於支持html5 webworker的現代瀏覽器方案:。

代碼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默認異步執行,相當於啟動另壹個線程,所以不會阻塞瀏覽器郡。