Worker - 表示通过脚本创建的后台任务

WorkerWeb Workers API 的接口,表示通过脚本创建的后台任务,该脚本可以将消息发送回其创建者。可以通过调用 Worker("path/to/worker/script") 构造函数来创建工作线程。

只要这些工作线程与父页面位于相同的上,这些工作线程便可以自己产生新的工作线程。(请注意:WebKit 尚未实现嵌套的工作线程)。

并非所有接口和功能都适用Worker 中的脚本。工作线程可以使用 XMLHttpRequest 进行网络通信,但是它的 responseXMLchannel 属性始终为 null。(也可以使用 fetch,它没有这种限制。)

在 Firefox 扩展中,如果要使用具有 js-ctypes 访问权限的工作线程,请改用 ChromeWorker 对象。

构造函数

Worker()

创建一个专用的 Web 工作线程,该工作线程执行指定 URL 的脚本。它也可以传入 Blob URL

属性

从其父接口 EventTarget 继承了属性,并从 AbstractWorker 实现了属性。

事件处理程序

AbstractWorker.onerror

一个 EventListener,每当类型为 errorErrorEvent 冒泡到工作线程时,就会调用到。它是从 AbstractWorker 继承的。

Worker.onmessage

一个 EventListener,每当类型为 messageMessageEvent 起泡时,就会调用到。例如,当当消息通过 DedicatedWorkerGlobalScope.postMessage 从工作线程发送到父文档时。消息存储在事件的 data 属性中。

Worker.onmessageerror

一个 EventHandler,表示触发 messageerror 事件时要调用的代码。

方法

从其父接口 EventTarget 继承了方法,并从 AbstractWorker 实现了属性。

Worker.postMessage()

向工作线程的内部范围发送一条消息(包含任何 JavaScript 对象)。

Worker.terminate()

立即终止工作线程。它不会让工作线程完成正在运行的操作,而是会立即停止。ServiceWorker 实例不支持此方法。

事件

message

当工作线程的父文档从该工作线程收到消息时触发。也可以通过 onmessage 属性处理。

messageerror

Worker 对象收到无法反序列化的消息时触发。也可以通过 onmessageerror 属性处理。

rejectionhandled

Promise 拒绝时,无论是否有处理程序来捕获拒绝,都会触发该事件。也可以通过 onrejectionhandled 事件处理程序属性来处理。

unhandledrejection

Promise 拒绝而没有处理程序来捕获拒绝时触发。也可以使用 onunhandledrejection 事件处理程序属性来处理。

实例

以下代码段使用 Worker() 构造函数创建一个 Worker 对象,然后使用该对象:

var myWorker = new Worker('/worker.js');
var first = document.querySelector('input#number1');
var second = document.querySelector('input#number2');

first.onchange = function() {
  myWorker.postMessage([first.value, second.value]);
  console.log('消息发布给工作线程');
}

有关完整实例,请参见我们的基本专用工作线程实例运行专用工作线程)。

规范

规范 状态 备注
HTML Living Standard
Worker 的定义
现行的标准 -

支持因不同类型的线程而异。有关详细信息,请参见每种工作线程类型的页面。

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持4123.51010.64
Worker() 构造函数4123.51010.64
message 事件4123.51010.64
messageerror 事件601857 未知47 未知
onmessage4123.51010.64
onmessageerror601857 未知47 未知
postMessage 支持12 支持10647 支持
terminate4123.51010.64

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持418 未知4 未知115.1
Worker() 构造函数418 未知4 未知115.1
message 事件418 未知4 未知11.55.1
messageerror 事件6060 未知57 未知47 未知
onmessage418 未知4 未知115.1
onmessageerror6060 未知57 未知44 未知
postMessage 支持 支持 未知 支持 未知44 支持
terminate418 未知4 未知115.1

1. 它是一个 Node EventEmitter 而不是 DOM EventTarget

2. Worker 脚本环境需要 CommonJS 模块。

3. 必须从 worker_threads 模块导入。

4. 采用完全不同的选项对象。

5. 支持该事件,但仅通过 Node EventEmitter 支持。

6. Internet Explorer 不支持 Transferable 对象。

7. 当工作线程终止时,还需要执行一个可选的回调。

跨域工作线程错误行为

在规范的早期版本中,加载跨域工作脚本会引发 SecurityError。如今,会引发 error 事件。可以在现在加载跨域工作线程会引发错误事件而不是抛出错误;不再允许使用沙盒 iframe 中的工作线程中了解如何处理此问题。

相关链接