SharedWorker - 表示可以从多个浏览上下文访问的工作线程
SharedWorker 接口代表一种特定类型的工作线程,可以从多个浏览上下文(例如,多个窗口,iframe,甚至工作线程)访问的工作线程。它们实现的接口不同于专用工作线程,并且具有不同的全局范围 SharedWorkerGlobalScope。
注意: 如果可以从多个浏览上下文访问
SharedWorker,则所有这些浏览上下文必须共享完全相同的来源(相同的协议,主机和端口)。
构造函数
SharedWorker()
创建一个共享的 Web 工作线程,该工作线程以指定的 URL 执行脚本。
属性
从其父接口 EventTarget 继承了属性,并实现了 AbstractWorker 的属性。
AbstractWorker.onerror
一个 EventListener,每当错误类型为 error 的 ErrorEvent 冒泡经过工作线程时,就会调用该方法。
SharedWorker.port 只读
返回一个 MessagePort 对象,该对象用于与共享工作线程通信并控制共享工作线程。
方法
从其父接口 EventTarget 继承了属性,并实现了 AbstractWorker 的属性。
实例
在我们的基本共享工作线程实例(运行共享工作实例),我们有两个 HTML 页面,每个页面都使用一些 JavaScript 进行简单的计算。不同的脚本使用相同的工作文件来执行计算 - 即使它们的页面在不同的窗口中运行,它们也可以访问该文件。
以下代码段显示了使用 SharedWorker() 构造函数创建 SharedWorker 对象的过程。这两个脚本都包含以下内容:
var myWorker = new SharedWorker('worker.js');
然后,两个脚本都通过使用 SharedWorker.port 属性创建的 MessagePort 对象访问工作程序。如果 onmessage 事件是使用 addEventListener 添加的,则端口将使用其 start() 方法手动启动:
myWorker.port.start();
当端口启动时,两个脚本都将消息发布到工作线程,并分别使用 port.postMessage() 和 port.onmessage 处理从其发送的消息:
first.onchange = function() {
myWorker.port.postMessage([first.value,second.value]);
console.log('消息发布给工作线程');
}
second.onchange = function() {
myWorker.port.postMessage([first.value,second.value]);
console.log('消息发布给工作线程');
}
myWorker.port.onmessage = function(e) {
result1.textContent = e.data;
console.log('Message received from worker收到工人的消息
');
}
在工作线程内部,我们使用 SharedWorkerGlobalScope.onconnect 处理线程连接到上面讨论的相同端口。可在 connect 事件的 ports 属性中访问与该工作线程相关的端口,然后我们使用 MessagePort start() 方法启动端口,以及使用 onmessage 处理程序来处理从主线程发送的消息。
onconnect = function(e) {
var port = e.ports[0];
port.addEventListener('message', function(e) {
var workerResult = '结果:' + (e.data[0] * e.data[1]);
port.postMessage(workerResult);
});
port.start(); // 使用 addEventListener 时必需。否则由 onmessage setter 隐式调用。
}
规范
| 规范 | 状态 | 备注 |
|---|---|---|
| HTML Living Standard SharedWorker 的定义 |
现行的标准 | 与 Unknown 相同。 |
桌面浏览器兼容性
| 特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|---|
| 基础支持 | 4 | 未知 | 29 | 10 | 10.6 | 5 — 6.1 |
SharedWorker() 构造函数 | 4 | 未知 | 29 | 10 | 10.6 | 5 — 6.1 |
port | 4 | 未知 | 29 | 10 | 10.6 | 5 — 6.1 |
移动浏览器兼容性
| 特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
|---|---|---|---|---|---|---|---|
| 基础支持 | 不支持 | 支持 | 未知 | 33 | 未知 | 11 | 5.1 — 7 |
SharedWorker() 构造函数 | 不支持 | 支持 | 未知 | 33 | 未知 | 11 | 5.1 — 7 |
port | 不支持 | 支持 | 未知 | 33 | 未知 | 11 | 5.1 — 7 |