Worker
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
* Some parts of this feature may have varying levels of support.
Worker 接口是 Web Workers API 的一部分,指的是一种可由脚本创建的后台任务,任务执行中可以向其创建者收发信息。要创建一个 Worker,只须调用 Worker(URL) 构造函数,函数参数 URL 为指定的脚本。
Worker 也可以创建新的 Worker,当然,所有 Worker 必须与其创建者同源(注意:Blink暂时不支持嵌套 Worker)。
需要注意的是,不是所有函数和构造函数 (或者说…类) 都可以在 Worker 中使用。具体参考页面 Worker 所支持的函数和类。Worker 可以使用 XMLHttpRequest 发送请求,但是请求的 responseXML 与 channel 两个属性值始终返回 null (fetch 仍可正常使用,没有类似的限制)。
备注:
如果你要在火狐浏览器的扩展使用 Worker 访问 js-ctypes,应使用 ChromeWorker 对象来替代。(译者注:这里没有看懂,希望有人能驳正,或添加说明)
构造函数
属性
继承父接口 EventTarget 的属性。
事件句柄
AbstractWorker.onerror-
当
ErrorEvent类型的事件冒泡到 worker 时,事件监听函数EventListener被调用。它继承于AbstractWorker. Worker.onmessage-
当
MessageEvent类型的事件冒泡到 worker 时,事件监听函数EventListener被调用。例如,一个消息通过DedicatedWorkerGlobalScope.postMessage,从执行者发送到父页面对象,消息保存在事件对象的data属性中。 Worker.onmessageerror-
当
messageerror类型的事件发生时,对应的事件处理器代码被调用。
方法
继承父接口 EventTarget 的方法。
Worker.postMessage()-
发送一条消息到最近的外层对象,消息可由任何 JavaScript 对象组成。
Worker.terminate()-
立即终止 worker。该方法不会给 worker 留下任何完成操作的机会;就是简单的立即停止。Service Worker 不支持这个方法。
示例
下面的代码通过构造函数 Worker() 创建了一个 Worker 对象。
var myWorker = new Worker("worker.js");
var first = document.querySelector("#number1");
var second = document.querySelector("#number2");
first.onchange = function () {
myWorker.postMessage([first.value, second.value]);
console.log("Message posted to worker");
};
完整的示例,请查阅 Basic dedicated worker example (run dedicated worker).
规范
| Specification |
|---|
| HTML> # dedicated-workers-and-the-worker-interface> |
浏览器兼容性
Loading…
不同类型的 worker 兼容度不一致,详细参考具体定义的页面。
跨域行为的错误事件
浏览器的早期版本中,加载跨域的执行者脚本导致 SecurityError事件。根据规范的变更,而新版本的浏览器只有error事件发生
参见
- 使用 Web Worker
- Web Worker 可用的函数和类
- 其他类型的 worker:
SharedWorker和 ServiceWorker. OffscreenCanvas接口