Worker - 表示通过脚本创建的后台任务
Worker 是 Web Workers API 的接口,表示通过脚本创建的后台任务,该脚本可以将消息发送回其创建者。可以通过调用 Worker("path/to/worker/script") 构造函数来创建工作线程。
只要这些工作线程与父页面位于相同的源上,这些工作线程便可以自己产生新的工作线程。(请注意:WebKit 尚未实现嵌套的工作线程)。
并非所有接口和功能都适用于 Worker 中的脚本。工作线程可以使用 XMLHttpRequest 进行网络通信,但是它的 responseXML 和 channel 属性始终为 null。(也可以使用 fetch,它没有这种限制。)
在 Firefox 扩展中,如果要使用具有 js-ctypes 访问权限的工作线程,请改用
ChromeWorker对象。
构造函数
Worker()
创建一个专用的 Web 工作线程,该工作线程执行指定 URL 的脚本。它也可以传入 Blob URL。
属性
从其父接口 EventTarget 继承了属性,并从 AbstractWorker 实现了属性。
事件处理程序
AbstractWorker.onerror
一个 EventListener,每当类型为 error 的 ErrorEvent 冒泡到工作线程时,就会调用到。它是从 AbstractWorker 继承的。
Worker.onmessage
一个 EventListener,每当类型为 message 的 MessageEvent 起泡时,就会调用到。例如,当当消息通过 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 的定义 |
现行的标准 | - |
支持因不同类型的线程而异。有关详细信息,请参见每种工作线程类型的页面。
桌面浏览器兼容性
| 特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|---|
| 基础支持 | 4 | 12 | 3.5 | 10 | 10.6 | 4 |
Worker() 构造函数 | 4 | 12 | 3.5 | 10 | 10.6 | 4 |
message 事件 | 4 | 12 | 3.5 | 10 | 10.6 | 4 |
messageerror 事件 | 60 | 18 | 57 | 未知 | 47 | 未知 |
onmessage | 4 | 12 | 3.5 | 10 | 10.6 | 4 |
onmessageerror | 60 | 18 | 57 | 未知 | 47 | 未知 |
postMessage | 支持 | 12 | 支持 | 106 | 47 | 支持 |
terminate | 4 | 12 | 3.5 | 10 | 10.6 | 4 |
移动浏览器兼容性
| 特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
|---|---|---|---|---|---|---|---|
| 基础支持 | 4 | 18 | 未知 | 4 | 未知 | 11 | 5.1 |
Worker() 构造函数 | 4 | 18 | 未知 | 4 | 未知 | 11 | 5.1 |
message 事件 | 4 | 18 | 未知 | 4 | 未知 | 11.5 | 5.1 |
messageerror 事件 | 60 | 60 | 未知 | 57 | 未知 | 47 | 未知 |
onmessage | 4 | 18 | 未知 | 4 | 未知 | 11 | 5.1 |
onmessageerror | 60 | 60 | 未知 | 57 | 未知 | 44 | 未知 |
postMessage | 支持 | 支持 | 未知 | 支持 | 未知 | 44 | 支持 |
terminate | 4 | 18 | 未知 | 4 | 未知 | 11 | 5.1 |
1. 它是一个 Node EventEmitter 而不是 DOM EventTarget。
2. Worker 脚本环境需要 CommonJS 模块。
3. 必须从 worker_threads 模块导入。
4. 采用完全不同的选项对象。
5. 支持该事件,但仅通过 Node EventEmitter 支持。
6. Internet Explorer 不支持 Transferable 对象。
7. 当工作线程终止时,还需要执行一个可选的回调。
跨域工作线程错误行为
在规范的早期版本中,加载跨域工作脚本会引发 SecurityError。如今,会引发 error 事件。可以在现在加载跨域工作线程会引发错误事件而不是抛出错误;不再允许使用沙盒 iframe 中的工作线程中了解如何处理此问题。
相关链接
- 使用网络工作线程
- 工作线程中可用的功能
- 其他类型的工作线程:
SharedWorker和 ServiceWorker。 - 扩展使用的非标准,Gecko 特有的工作线程:
ChromeWorker。