Worker

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 对象来替代。(译者注:这里没有看懂,希望有人能驳正,或添加说明)

构造函数

Worker()
创建一个专用Web worker,它只执行URL指定的脚本。使用 Blob URL 作为参数亦可。

属性

继承父对象EventTarget 的属性,以及实现对象 AbstractWorker (en-US)的属性。

事件句柄

AbstractWorker.onerror (en-US)
ErrorEvent 类型的事件冒泡到 worker 时,事件监听函数 EventListener 被调用. 它继承于 AbstractWorker (en-US).
Worker.onmessage
MessageEvent类型的事件冒泡到 worker 时,事件监听函数 EventListener 被调用.  例如,一个消息通过 DedicatedWorkerGlobalScope.postMessage (en-US),从执行者发送到父页面对象,消息保存在事件对象的 data (en-US) 属性中.
Worker.onmessageerror
messageerror 类型的事件发生时,对应的event handler 代码被调用。

方法

继承父对象EventTarget 的方法,以及实现对象 AbstractWorker (en-US)的方法。

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 (en-US)事件发生。关于如何处理这种事件的更多信息参考 Loading cross-origin worker now fires error event instead of throwing; worker in sandboxed iframe no longer allowed.

相关链接