1. 程式人生 > 實用技巧 >web worker

web worker

web worker 多開子執行緒,且這些子執行緒無I/O許可權,只能為主執行緒分擔一些諸如計算的任務

不足
worker內程式碼不能操作DOM(更新UI)
只能載入伺服器的js檔案且不能跨域載入JS
不是所有瀏覽器都支援這個特性

API
1. 主執行緒
①建立新的Worker
var worker = new Worker(“worker.js”)

②傳遞引數
worker.postMessage()

③接收訊息
worker.onMessage = function(msg){}
worker.onmessageerror = function(msg){}

④異常處理
worker.onerror = function(err){}

⑤結束worker
worker.terminate()

2.worker執行緒
self.name: Worker 的名字。該屬性只讀,由建構函式指定。
self.onmessage:指定message事件的監聽函式。
self.onmessageerror:指定 messageerror 事件的監聽函式。傳送的資料無法序列化成字串時,會觸發這個事件。
self.close():關閉 Worker 執行緒。
self.postMessage():向產生這個 Worker 執行緒傳送訊息。
self.importScripts():載入 JS 指令碼。


示例

index.html程式碼:

<!DOCTYPE html
> <html> <body> <p>Count numbers: <output id="result"></output></p> <button onclick="startWorker()">Start Worker</button> <button onclick="stopWorker()">Stop Worker</button> <input type="text" value="" /> <script
> var w; function startWorker() { if (typeof Worker !== 'undefined') { if (typeof w === 'undefined') { w = new Worker('demo_workers.js'); } w.onmessage = function (event) { document.getElementById('result').innerHTML = event.data; }; } else { document.getElementById('result').innerHTML = 'Sorry, your browser does not support Web Workers...'; } } function stopWorker() { w.terminate(); } </script> </body> </html>

demo_workers.js程式碼:

function timedCount () {
  for (var i = 0; i < 10000000000; i++) {
    if (i % 100000 === 0) {
      postMessage(i);
    }
  }
}

timedCount();

執行結果: