隨著HTML5的掘起,前端能做的事也越來越多,例如Web Worker就可以在背景執行讓前端有多執行緒效果,這樣對於一些前端大量資料的運算或整理上大有幫助,不過要注意瀏覽器支援的問題(可以到這裡查看支援版號)

使用方法
index.html

//呼叫Worker
var worker = new Worker('worker.js');
//傳送訊息給Worker
worker.postMessage("TEST");
//Worker回傳
worker.addEventListener('message', function(e) {
	console.log('Worker said: ', e.data);
}, false);
//Worker Error Event
worker.addEventListener('error', function(error){
	console.error(error)
});
//release worker,與worker端的self.close()擇其一使用
//worker.terminate();

worker.js

self.addEventListener('message', function(e) {
    //Import Library
    importScripts("function.js");
    self.postMessage(e.data + " " + returnHello() );
    //release worker
    self.close();
}, false);

另外補充,因為Worker post的東西是有限制的,像下列的都不能使用

  • window
  • DOM
  • document
  • parent

Worker只能使用基本的javascript(陣列、字串等),以及XMLHttpRequest

另外SharedWorker也可以在不同頁面上共享資源
index.html

var worker = new SharedWorker("worker.js");
worker.port.addEventListener("message", function(e) {
    alert(e.data);
}, false);
//啟動port
worker.port.start();
// post資料到shared web worker上
worker.port.postMessage("Johnson");

worker.js

//加總
var connections = 0;

//連接SharedWorker
self.addEventListener("connect", function (e) {
    var port = e.ports[0];
    connections++;
	//SharedWorker nessage
    port.addEventListener("message", function (e) {
        port.postMessage("Hello " + e.data + " (port #" + connections + ")");
    }, false);
	//啟動port才能繼續postMessage
    port.start();
}, false);
Categories: JavaScript