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){ } |
子線程 與 子線程通訊
只能經過前臺作爲一箇中介進行通訊
注意: 不在站中測試將致使找不到資源文件