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
。