Web Workers

當(dāng)瀏覽器切換到后臺運(yùn)行,操作系統(tǒng)會把瀏覽器掛起,掛起之后,比如定時器,在回到原來頁面的時候,會出現(xiàn)獲取秒有重復(fù)的問題,代碼參考如下

var timer = setInterval(function() {
    var date1 = new Date();
    console.log(date1.getSeconds());
}, 1000)

為了解決這個問題,就可以通過H5引入的Web Workes來解決,也能解決一些比較函數(shù)的計算.
Web Workers是運(yùn)行在后臺的JS代碼,不會影響頁面的性能,創(chuàng)建了一個worker,可以將消息發(fā)送給創(chuàng)建它的js,通過事件處理指定的業(yè)務(wù).而且worker使用的是外部JS文件

1.基本使用

worker在創(chuàng)建的時候,需要使用一個構(gòu)造函數(shù),構(gòu)造函數(shù)里需要一個參數(shù),指定外部js文件的路徑

var work = new Worker("work.js");

如果想通過work.js文件獲取數(shù)據(jù)或者計算的結(jié)果,需要給work對象添加方法監(jiān)聽,打印一下已經(jīng)創(chuàng)建好的work對象,里面會有兩部分,一個是onmessage,用來接收外部js文件發(fā)送的數(shù)據(jù),另一個是onerror,用來處理錯誤

// work.js代碼
function timedCount()
{   
    var currentDate = null;
    currentDate = new Date();
    postMessage(currentDate.getSeconds());
    setTimeout("timedCount()",1000);
}
timedCount();

這個方法就是獲取對應(yīng)的秒,然后把秒進(jìn)行返回.這里用了一個方法postMessage,這個方法能直接把值發(fā)送到work對象綁定的onmessage方法上,setTimeout用來循環(huán)調(diào)用方法,模擬setInterval.這里如果使用setInterval,計時器越來越多,瀏覽器也受不了啊.

// index.html的js代碼
work.onmessage = function(event) {
    console.log(event.data);
}

事件對象event.data就是從postMessage發(fā)送過來的值.還有可以通過下面方式在html頁面里綁定事件

work.addEventListener("message", function(event) {
    console.log(event.data);
}, false);

2.終止worker

在html里可以通過函數(shù)terminate()終止worker接受消息,一旦使用了terminate之后,無法重新啟用,只能重新的創(chuàng)建

work.onmessage = function(event) {
    if(event.data == 12){
        work.terminate();
    }
    console.log(event.data);
}

網(wǎng)上有的博客里寫在worker里能使用close()方法也能停止,不過不好用

3.異步計算

通過worker可以計算一些比較復(fù)雜的計算,然后可以把計算結(jié)果返回,而且會把這個計算放到任務(wù)隊(duì)列里

work.onmessage = function(event) {
    console.log(event.data);
}
console.log(1);

worker.js代碼

function test(){
    var count = 0;
    for(var i = 0; i <100000; i++){
        count +=i
    }
    postMessage(count);
}
test()

打印完之后先打印的是1,然后是計算,系統(tǒng)會把worker里的復(fù)雜計算放到任務(wù)隊(duì)列里,等到主線程的運(yùn)算進(jìn)行完,在執(zhí)行任務(wù)隊(duì)列里的任務(wù),也能實(shí)現(xiàn)異步的操作

4.實(shí)現(xiàn)ajax

就是把a(bǔ)jax請求的過程都放到worker里去執(zhí)行,獲取數(shù)據(jù)之后,在通過postMessage()方法發(fā)送請求過來的數(shù)據(jù),下面是對應(yīng)的代碼實(shí)現(xiàn)

var work = new Worker("work.js");
// 把請求方式和地址作為參數(shù)發(fā)送給worker文件
work.postMessage({
    type:"get",
    url:"work.php"
});
work.onmessage = function(event) {
    console.log(event.data);
}

work.js代碼

addEventListener("message", function(event){
    var obj = event.data;
    var request = new XMLHttpRequest();
    obj.type = obj.type || "get";
    obj.data = obj.data || {};
    if(obj.type.toLowerCase() == "get"){
        var path = pathAdd("get", obj.url, obj.data);
        request.open("GET", path);
        request.send();
    } else if(obj.type.toLowerCase() == "post"){
        request.open("POST", obj.url);
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        var data = pathAdd("post", obj.url, obj.data);
        request.send(data);
    }
    request.onreadystatechange = function(){
        if(request.status == 200 && request.readyState == 4){
            postMessage(request.responseText);
            
        }
    }
})
function pathAdd(type, url, data){
    var arr = []; 
    for (var i in data) {
        arr.push(i+"="+data[i]);
    }
    if(type == "get"){
        return url+"?"+arr.join("&");
    } else {
        return arr.join("&");
    }
}

5.DedicatedWorkerGlobalScope

worker.js里,有一個自己的作用域,打印self,在之前,self一般指的是window,但是在worker里,self指的是一個叫DedicatedWorkerGlobalScope的對象,包括添加的方法和發(fā)送的信息都是由這個對象來完成.如果想在這個作用域里引用一下功能的函數(shù),可以使用importScripts()來引入

6.注意

還是有一些東西需要注意一樣:
1.Web Worker無法訪問DOM節(jié)點(diǎn)蕉扮;
2.Web Worker無法訪問全局變量或是全局函數(shù)宣蔚;
3.Web Worker無法調(diào)用alert()或者confirm之類的函數(shù);
4.Web Worker無法訪問window土浸、document之類的瀏覽器全局變量
但是Web Worke里可以訪問navigator對象里的一些屬性appName,appVersion,platform,userAgent

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砌左,一起剝皮案震驚了整個濱河市汇四,隨后出現(xiàn)的幾起案子鬼店,更是在濱河造成了極大的恐慌,老刑警劉巖师骗,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件历等,死亡現(xiàn)場離奇詭異,居然都是意外死亡辟癌,警方通過查閱死者的電腦和手機(jī)寒屯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黍少,“玉大人寡夹,你說我怎么就攤上這事〕е茫” “怎么了菩掏?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昵济。 經(jīng)常有香客問我智绸,道長,這世上最難降的妖魔是什么访忿? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任瞧栗,我火速辦了婚禮,結(jié)果婚禮上海铆,老公的妹妹穿的比我還像新娘迹恐。我一直安慰自己,他們只是感情好游添,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布系草。 她就那樣靜靜地躺著,像睡著了一般唆涝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唇辨,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天廊酣,我揣著相機(jī)與錄音,去河邊找鬼赏枚。 笑死亡驰,一個胖子當(dāng)著我的面吹牛晓猛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凡辱,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼戒职,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了透乾?” 一聲冷哼從身側(cè)響起洪燥,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乳乌,沒想到半個月后捧韵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汉操,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年再来,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磷瘤。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡芒篷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出采缚,到底是詐尸還是另有隱情针炉,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布仰担,位于F島的核電站糊识,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏摔蓝。R本人自食惡果不足惜赂苗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贮尉。 院中可真熱鬧拌滋,春花似錦、人聲如沸猜谚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魏铅。三九已至昌犹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間览芳,已是汗流浹背斜姥。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铸敏。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓缚忧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杈笔。 傳聞我的和親對象是個殘疾皇子闪水,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容

  • JS異步那些事 一 (基礎(chǔ)知識)JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那...
    夢很想家閱讀 615評論 0 0
  • 1.JS單線程 說起Web Workers,首先必須了解因?yàn)镴S運(yùn)行在瀏覽器中蒙具,是單線程的球榆,每個window一個J...
    RossWen閱讀 580評論 1 11
  • 什么是 Web Worker?當(dāng)在 HTML 頁面中執(zhí)行腳本時店量,頁面的狀態(tài)是不可響應(yīng)的芜果,直到腳本已完成。web w...
    索哥來了閱讀 311評論 0 0
  • Web Workers可以讓web應(yīng)用程序具備后臺處理能力融师,使用Worker類加載一個javascript文件來開...
    幸福鐮刀閱讀 713評論 1 0
  • 寂靜的夜 十月的風(fēng)從腳下吹過 孤獨(dú)的身影搖搖欲墜 死亡的氣息空氣中彌漫 虛無的世界帶我走向盡頭
    狂笑當(dāng)歌閱讀 155評論 0 2