Frontend
JS|web workers
透過 worker 建構子便可以產生 worker 物件,並且執行 JavaScript 檔案。在 worker 中的 JavaScript…
This article isn't available in this language yet — showing the original below.
透過 worker 建構子便可以產生 worker 物件,並且執行 JavaScript 檔案。在 worker 中的 JavaScript 運行在不同於 window 的執行緒環境,所以在 worker 中存取全域物件應該要透過 self ,如果透過 window 會導致錯誤發生。
Dedicated workers#
if (window.Worker) { // 產生 dedicated worker, worker.js檔案需要server提供 var worker = new Worker('./worker.js') worker.postMessage(['first.value', 'second.value']); worker.onmessage = function(e) { console.log('onmessage', e.data) }}onmessage = function(e) { console.log(e) var workerResult = 'Result: ' + e.data[0] + e.data[1]; postMessage(workerResult);};結束 worker#
myWorker.terminate();請注意不論 worker 正在執行的運算完成與否,一但呼叫後 worker 便會立刻被終止。 而在 worker 執行緒裡,worker 可以呼叫自己的 close 方法來結束
close();Shared workers#
shared web worker 能夠被多個程式腳本存取,即使是跨越不同 window、iframe 或 worker。但是瀏覽器支援度較低
if (window.SharedWorker) { var myWorker = new SharedWorker("sharedWorker.js"); myWorker.port.onmessage = function (e) { console.log('Message received from worker', e); c c myWorker.port.postMessage([8,8]);}onconnect = function(e) { var port = e.ports[0]; port.onmessage = function(e) { var workerResult = 'Result: ' + (e.data[0] * e.data[1]); port.postMessage(workerResult); }
port.start(); // 註冊 onmessage 事件的同時也自動建立連線,所以說不需要呼叫start() 了}other worker#
-
ServiceWorkers 基本上如同介於 web app 和瀏覽器以及網路之間的代理伺服器 (proxy server),這類 worker 重點在實現離線服務,service worker 會攔截網路請求,然後依據網路連線和資源狀態做出反應,他們可以存取推播和背景同步 APIs。
-
Chrome Workers
-
Audio Workers 主要用於音效處理部分。