HTML5 Web Workers

Web worker 是在網頁後臺執行的 JavaScript 程式碼。

什麼是 Web Workers

如果你嘗試使用 JavaScript 進行密集型任務非常耗時且需要大量計算,則會凍結網頁並中斷使用者,直到作業完成。這是因為 JavaScript 程式碼總是在前臺執行。

HTML5 引入了一項名為 Web worker 的新技術,該技術專門用於獨立於其他使用者介面指令碼進行後臺工作,而不會影響頁面的效能。與 JavaScript 不同,Web worker 不會中斷使用者,並且 Web 頁面保持響應,因為它們在後臺執行任務。

提示: 所有主要的現代瀏覽器(如 Firefox,Chrome,Opera,Safari 和 Internet Explorer 10+)都支援 HTML5 的 Web 工作者功能。

建立 Web Workder 檔案

Web Worker 最簡單的用途是執行耗時的任務。所以這裡我們將建立一個從 0 到 100,000 的簡單 JavaScript 任務。讓我們建立一個名為 worker.js 的外部 JavaScript 檔案,然後輸入以下程式碼。

var i = 0;
function countNumbers(){
    if(i < 100000){
        i = i + 1;
        postMessage(i);
    }
 
    // Wait for sometime before running this script again
    setTimeout("countNumbers()", 500);
}
countNumbers();

注意: postMessage() 方法用於將訊息(如上例中的數字)從 Web worker 檔案傳送回 Web 頁面。

與 Web Worker 一起在後臺工作

現在我們已經建立了我們的 Web worker 檔案。在本節中,我們將從 HTML 文件啟動 Web worker,該文件在後臺執行名為 worker.js 的檔案中的程式碼,並逐步在 Web 頁面上顯示結果。

<!DOCTYPE html>
<html lang="en">
<head>
<title>HTML5 Web Worker</title>
<script type="text/javascript">
    if(window.Worker){
        // Set up global variable
        var worker;
      
        // Create a new web worker
        worker = new Worker("worker.js");
        
        // Fire onMessage event handler
        worker.onmessage = function(event){
            document.getElementById("result").innerHTML = event.data;
        };
    } else{
        alert("Sorry, your browser do not support web worker.");
    }
</script>
</head>
<body>
	<div id="result">
        <!--Received messages will be inserted here-->
    </div>
</body>
</html>

示例說明:

上例中的 JavaScript 程式碼具有以下含義:

  • var worker = new Worker("worker.js"); 建立一個新的 Web worker 物件,用於與 Web worker 通訊。
  • 當工作人員釋出訊息時,它會觸發 onmessage 事件處理程式,該處理程式允許程式碼從 Web worker 接收訊息。
  • event.data 元素都包含了網路工作者傳送的訊息。

注意: 工作程式執行的程式碼始終儲存在單獨的 JavaScript 檔案中。這是為了防止 Web 開發人員編寫嘗試使用全域性變數或直接訪問頁面上元素的 Web worker 程式碼。

終止 Web Worker

到目前為止,你已經學會了如何建立 worker 並開始接收訊息。但是,你也可以在計算過程中終止正在執行的工作程式。

以下示例將向你展示如何通過單擊 HTML 按鈕從 Web 頁面啟動和停止 worker。它使用我們在前一個示例中使用的相同 JavaScript 檔案’worker.js’來計算從零到 100000 的數字。

<!DOCTYPE html>
<html lang="en">
<head>
<title>HTML5 Web Worker</title>
<script type="text/javascript">
    // Set up global variable
    var worker;
    
    function startWorker(){
        // Initialize web worker
        worker = new Worker("worker.js");
        
        // Run update function, when we get a message from worker
        worker.onmessage = update;
        
        // Tell worker to get started
        worker.postMessage("start");
    }
    
    function update(event){
        // Update the page with current message from worker
        document.getElementById("result").innerHTML = event.data;
    }
    
    function stopWorker(){
        // Stop the worker
        worker.terminate();
    }
</script>
</head>
<body>
    <h1>Web Worker Demo</h1>
    <button onclick="startWorker();" type="button">Start web worker</button>
    <button type="button" onclick="stopWorker();">Stop web worker</button>
    <div id="result">
        <!--Received messages will be inserted here-->
    </div>
</body>
</html>

提示: 使用 Web worker 僅執行不會中斷使用者介面指令碼的重量級 JavaScript 任務(即響應點選或其他使用者互動的指令碼)。不建議將 Web worker 用於簡短任務。