我們都知道客戶端JAVAScript有一個基本的特性就是單線程。這是有一定歷史原因的,暫且不深究。隨著web應用的越來越復雜,客戶端的js可能會承擔越來越繁重的計算任務,從而導致UI線程被阻塞無法及時響應用戶的操作。
worker的出現(xiàn),就是來解放主線程的js的計算任務的,由于安全的考慮,worker也會受到一定的限制。
1. 基本知識
在Web Worker標準中,定義了解決客戶端JavaScript無法多線程的問題。
worker是指執(zhí)行代碼的并行線程。Web Workers處在一個自包含的執(zhí)行環(huán)境,無法訪問Window對象和Document對象,和主線程之間的通信也只能通過異步消息傳遞機制來實現(xiàn)。提供一種使用異步API的方式,同時運行書寫需要長時間運行的函數(shù)而不會帶來循環(huán)事件和導致瀏覽器崩潰的問題。Web Workers標準中,有兩部分組成Worker對象和WorkerGlobalScope全局對象。2. Worker對象
使用構(gòu)造函數(shù)Worker()創(chuàng)建Worker對象var loader = new Worker(url)url:可以采用相對路徑和絕對路徑,但是采用絕對路徑必須和包含該腳本的文檔是同源的。使用postMessage()傳遞參數(shù)給Worker傳遞給postMessage()方法的值hi賦值,最終的副本會通過message事件傳遞給Worker
loader.postMessage('file.txt');通過message事件來接收Work的響應消息
worker.onmessage = function(e){ var message = e.data; console.log('URL contents: ' + message);}使用terminate()終止Worker
worker.onmessage = function(e){ //接收處理Worker的響應消息 //終止worker worker.terminate();}
此外,Worker可以通過error事件來處理異常。
worker.onerror = function(e){ concole.log('Error at ' + e.filename + ':' + e.lineno + ':' + e.message);}
和所有事件目標一樣,Worker對象也定義了標準的addEventListener()和removeEventListener()
3. WorkerGlobalScope全局對象
在通過Worker()構(gòu)造函數(shù)創(chuàng)建一個新Worker的時候,指定了包含JavaScript代碼文件的URL。該代碼會運行在一個全新的JavaScript運行環(huán)境中,完全和創(chuàng)建Worker的腳本隔離開來。
WorkerGlobalScope全局對象表示了該新的運行環(huán)境,它是新創(chuàng)建的Worker的全局對象。
3.1 與外部Worker的通信
1. postMessage() & message事件
WorkerGlobalScope對象同樣有postMessage()方法和message事件,利用這兩者可以與外部Worker進行通信
//worker內(nèi)部onmessage = function(e){ postMessage(e.data);}
2. close()
同樣,Worker可以使用close()來關(guān)閉自己,但是要注意的是,Worker對象上沒有定義任何API用于檢測Worker是否已關(guān)閉。因此,如果一個Worker要使用close()方法將自己關(guān)閉,那么最好是先傳遞”關(guān)閉”的信息。
3. importScripts()
Worker內(nèi)部使用此方法來加載任何需要的庫代碼。而是此方法是一個同步的方法,它在直到所有的腳本都已經(jīng)載入并運行完成才會返回。
//在開始工作前,現(xiàn)在如需要的類、工具函數(shù)importScript('collections/Set.js','utils/base64.js');
3.2 WorkerGlobalScope的屬性
它擁有所有核心JavaScript全局對象擁有的屬性,同時,還擁有部分客戶端Window對象的一些屬性。
self:對全局對象自身的引用計數(shù)器方法:setTimeout()/clearTimeout()/setInterval()/clearInterval()location:只讀navigator常用的事件目標方法:addEventListener()和removeEventListener()onerror屬性4. 應用場景:腳本化HTTP請求
WorkerGlobalScope對象好包含一些重要的構(gòu)造函數(shù),其中就有XMLHttpRequest(),以便Worker可以通過它進行腳本化的HTTP請求。
在Worker中發(fā)起同步的XmlHttpRequest
//Worker內(nèi)部onmessage = function(e){ var urls = e.data; //要獲取的url var contents = []; //url指定的內(nèi)容 var i,len,url; for(i = 0, len = urls.length; i < len; i++){ var url = urls[i]; var xhr = new XMLHttpRequest(); xhr.open('GET',url,false);//false表示進行同步請求 xhr.send(); if(xhr.status !== 200){ throw Error(xhr.status + ' ' + xhr.statusText + ': ' + url); } contents.push(xhr.responseText); } //返回url的內(nèi)容 postMessage(contents);}
1.《worker Worker基礎(chǔ)知識》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《worker Worker基礎(chǔ)知識》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/keji/346393.html