WebWorker
Web Worker 为 Web 内容在后台线程中运行脚本提供了一种简单的方法。
线程可以执行任务而不干扰用户界面。
此外,他们可以使用 XMLHttpRequest 执行 I/O (尽管 responseXML 和 channel 属性总是为空)。
一旦创建, 一个 worker 可以将消息发送到创建它的 JavaScript 代码, 通过将消息发布到该代码指定的事件处理程序(反之亦然)。
Web Workers API
使用 Web Workers | MDN (opens new window)
Worker() 构造函数创建一个 Worker 对象,该对象执行指定的 URL 脚本。这个脚本必须遵守 同源策略 。
这个文件包含将在工作线程中运行的代码;
workers 运行在另一个全局上下文中,不同于当前的 window。
因此,在 Worker 内通过 window 获取全局作用域 (而不是 self) 将返回错误。
如果 此 URL 有一个无效的语句,或者违反同源策略,一个 SECURITY_ERR 类型的 DOMException 被抛出。
- 语法
const myWorker = new Worker(aURL, options)
参数
aUrl : 表示 worker 将执行的脚本的 URL。它必须遵守同源策略
options 可选
包含可在创建对象实例时设置的选项属性的对象。可用属性如下:
type:用以指定 worker 类型的 DOMString 值. 该值可以是 classic 或 module. 如果未指定,将使用默认值 classic.credentials: 用以指定 worker 凭证的 DOMString 值.该值可以是 omit, same-origin,或 include.。如果未指定,或者 type 是 classic,将使用默认值 omit (不要求凭证)。name:在 DedicatedWorkerGlobalScope 的情况下,用来表示 worker 的 scope 的一个 DOMString 值,主要用于调试目的。返回值
创建的 worker。
在 worker 线程中你可以运行任何你喜欢的代码,不过有一些例外情况。
比如:在 worker 内,不能直接操作 DOM 节点,也不能使用 window 对象的默认方法和属性。
然而你可以使用大量 window 对象之下的东西,包括 WebSockets,IndexedDB 以及 FireFox OS 专用的 Data Store API 等数据存储机制。
workers 和主线程间的数据传递通过这样的消息机制进行——双方都使用 postMessage()方法发送各自的消息,
使用 onmessage 事件处理函数来响应消息(消息被包含在 Message 事件的 data 属性中)。这个过程中数据并不是被共享而是被复制。
只要运行在同源的父页面中,workers 可以依次生成新的 workers;并且可以使用 XMLHttpRequest 进行网络 I/O。
但是 XMLHttpRequest 的 responseXML 和 channel 属性总会返回 null。