Web Worker API
worker API 是一个 Web API,它允许我们在后台线程中运行 JavaScript 代码。每当网页在浏览器中加载时,它都会在浏览器中加载每个 <script> 标记后变为交互式。Web Worker 允许用户与网页交互,而无需在浏览器中加载整个 JavaScript 代码。它增加了网页的响应时间。
创建 Web Worker 文件
要创建 Web Worker,您需要在外部文件中编写脚本,您需要在不同的文件中执行该脚本。
文件名应具有“.js”扩展名。
在下面的 JavaScript 代码中,我们定义了 counter() 函数。我们在函数中使用了 setTimeout() 方法,每 1000 毫秒后调用 counter() 函数。
代码的重要部分是 postMessage() 方法。它用于在主线程中发送数据。
检查 Web Worker 支持
在创建 Web Worker 之前,您应该检查您的浏览器是否支持 Web Worker。您可以使用 typeof 运算符来检查这一点。
创建 Web Worker 对象
创建外部 JavaScript 文件后,您需要通过将外部 JavaScript 文件的路径作为参数传递来创建新的 Worker 对象,如下所示。
要从我们使用 postMessage() 方法发送的 worker 文件中获取消息主线程,您可以在 worker 对象上使用 'onmessage' 事件,如下所示。
终止 Web Worker 的执行
当您开始执行 Web Worker 脚本时,它会继续执行,直到您终止执行。
您可以使用 terminate() 方法终止 Web Worker 的执行,如下所示。
示例:Web Worker 的完整程序
文件名: - index.html
在下面的代码中,我们定义了 startWorker() 和 stopWorker() 函数来启动和停止 worker 的执行。
在 startWorker() 函数中,首先检查浏览器是否支持 worker。之后,我们检查 worker 的任何实例是否正在运行。如果没有,我们使用外部文件中定义的脚本创建 Worker 对象的新实例。
之后,我们在 worker 对象上添加了 'onmessage' 事件。因此,每当它从外部脚本文件获取数据时,它都会打印数据并执行其他操作。
在 stopWorker() 函数中,我们将 terminate() 方法与 workerObj 对象一起使用,以终止 worker 的执行。
文件名: - app.js
在下面的代码中,我们定义了 counter() 函数。在 counter() 函数中,我们使用 setTimeOut() 方法在每秒后调用 counter() 函数。它还使用 postMessage() 方法将数据发布到主线程中。
输出
要运行上述代码,您需要确保 index.html 和 app.js 文件位于实时 Web 服务器上。您也可以使用 localhost.此外,请确保在 index.html 文件内的 Worker 对象中为 app.js 文件添加正确的路径。

您还可以在同一文件中使用多个工作程序在后台运行多个脚本。
Web Worker 使用案例
上面的例子很简单,在这种情况下,你不需要使用 Web Worker,但它仅用于演示。
以下是 Web Worker 的实时用例。
- 当您需要执行大型或复杂的数学脚本时
- 在 HTML 游戏中,您可以使用 Web Worker
- 如果您想提高网站性能
- 在并行下载中,当您需要执行多个线程时
- 对于后台数据同步
- 在机器学习中
- 用于生成报告
- 处理音频和视频
Web Worker 和 DOM
由于您需要在外部文件中为 Web Worker 定义脚本,因此不能在外部文件中使用以下对象。
- window 对象
- document 对象
- parent 对象
但是,您可以在 Web Worker 中使用以下对象。
- location 对象
- navigator 对象
- Application 缓存 (应用程序缓存)
- 使用 importScripts() 导入外部脚本
- XMLHttpRequest (XMLHttp请求)