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 用于简短任务。