Worker - Web API 接口参考 编辑
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
的属性。
事件句柄
AbstractWorker.onerror
- 当
ErrorEvent
类型的事件冒泡到 worker 时,事件监听函数EventListener
被调用. 它继承于AbstractWorker
. Worker.onmessage
- 当
MessageEvent
类型的事件冒泡到 worker 时,事件监听函数EventListener
被调用. 例如,一个消息通过DedicatedWorkerGlobalScope.postMessage
,从执行者发送到父页面对象,消息保存在事件对象的data
属性中. Worker.onmessageerror
- 当
messageerror
类型的事件发生时,对应的EventHandler
代码被调用。
方法
继承父对象EventTarget
的方法,以及实现对象 AbstractWorker
的方法。
Worker.postMessage()
- 发送一条消息到最近的外层对象,消息可由任何 JavaScript 对象组成。
Worker.terminate()
- 立即终止 worker。该方法不会给 worker 留下任何完成操作的机会;就是简单的立即停止。Service Woker 不支持这个方法。
示例
下面的代码通过构造函数 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).
规范
规范 | 状态 | 说明 |
---|---|---|
HTML Living Standard Worker | Living Standard |
浏览器兼容性
BCD tables only load in the browser
不同类型的worker兼容度不一致,详细参考具体定义的页面。
跨域行为的错误事件
浏览器的早期版本中,加载跨域的执行者脚本导致 SecurityError
事件。根据规范的变更,而新版本的浏览器只有error
事件发生。关于如何处理这种事件的更多信息参考 Loading cross-origin worker now fires error event instead of throwing; worker in sandboxed iframe no longer allowed.
相关链接
- Using web workers
- Functions available to workers
- Other kind of workers:
SharedWorker
and ServiceWorker. - Non-standard, Gecko-specific workers:
ChromeWorker
, used by extensions.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论