worker - javaScript多線程編程

    Web Workers 是 HTML5 提供的一個javascript多線程解決方案,咱們能夠將一些大計算量的代碼交由web Worker運行而不凍結用戶界面。它獨立於其餘腳本,不會影響頁面的性能。您能夠繼續作任何願意作的事情:點擊、選取內容等等,而此時 web worker 在後臺運行。javascript

      一、Web Worker的建立是在主線程當中經過傳入文件的url來實現的。以下所示:
var webworker=new Worker('my_task.js');             返回的webworker對象,該對象能夠完成與worker線程的通訊java

webworker.postMessage()                                        向線程發送消息web

webworker.onmessage=function(evt){}                  來監聽worker線程發送到主線程的消息ajax

webworker.onerror=function(evt){}                       來監聽線程中的錯誤消息跨域

webworker.terminate()                                            來告訴worker線程當即終止執行。 瀏覽器


      二、web worker線程是沒法操做Dom對象的,因此像prompt、alert、console等都是沒法在web worker線程中使用的,因此調試不太處理。可是能夠將調試發送給主線程,主線程經過web worker線程發出的請求做出處理,Jquery是不行了。session


      三、用於建立webworker線程的js文件必須和當前頁面遵循同源策略,也就是說不能跨域請求js文件;另外,線程之間的消息傳遞是不能有Function對象的,就是說不可以傳遞函數,在safari瀏覽器中只能傳遞數字/字符串等基本值(連Object都不行)。而且全部線程之間的數據並非常規的引用方式,都是一份獨立的拷貝。所以通常狀況下,咱們會將傳遞的參數轉化爲字符串進行傳遞,能夠經過JSON.stringify()JSON.parse()來處理。多線程

 

Worker API異步

1.onmessage :  接收數據函數

2.postMessage(data) : 發送數據

3.importScripts("xx.js","xx.js"...) :用於導入javaScript腳本

4.sessionStorge/localStorage: 徹底能夠在Worker線程中使用Storage來執行本地存儲

5.Worker  :建立新的worker對象來啓動嵌套線程

6.*XMLHttpRequest  :Worker線程中可使用XMLHttpRequest來發送異步請求。就是ajax

7.navigator:  這是一個WorkerNavigator對象,該對象的功能與window裏的navigator屬性類似。

8.localtion:  這是一個WorkerLoaction對象,該對象的功能與window裏的localtion屬性類似。

9.self: 表明了當前worker線程自身的做用域。調用self.close(); 能夠結束本線程。

10. setTimeout()/setInterval()/eval()/isNaN()/parsInt()等。。。

 

 

主線程 與 子線程通訊

 

主線程:

 

 var worker = new Worker('worker.js');
    var data = {id:"messgae"};
    //向子線程發送數據
    worker.postMessage(JSON.stringify(data));
    //worker.terminate(); 關閉線程
    //接收子線程的數據
    worker.onmessage = function(event){
       console.info(event.data);
    }

 

 

子線程:

 

//導入js
importScripts("temp.js");

//self.close(); 能夠關閉線程
//從主線程接收數據 
onmessage = function(event){
     var data = JSON.parse(event.data);
     var id = data.id;
     //這js文件的路徑
     var path = location.href;
     //發送數據到主線程
     postMessage(id);    
}
onerror = function(event){

}

 

子線程 與 子線程通訊

 

只能經過前臺作爲一箇中介進行通訊

 

注意: 不在站中測試將致使找不到資源文件

相關文章
相關標籤/搜索