JS Web Workers
· 阅读需 2 分钟
什么是 Web Workers
Worker - Web API 接口参考 | MDN## 有哪些实际用处?
Worker 线程中全局对象为 self
,代表子线程自身,这时 this
指向self
,其上有一些 api:
self.postMessage
: worker 线程往主线程发消息,消息可以是任意类型数据,包括二进制数据self.close
: worker 线程关闭自己self.onmessage
: 指定主线程发 worker 线程消息时的回调,也可以self.addEventListener('message',cb)
self.onerror
: 指定 worker 线程发生错误时的回调,也可以self.addEventListener('error',cb)
优点
- 可以通过
Web Workers
把需要大量计算的工作交接给worker
处理,不占用主线程。 - 通过
postMessage
和onmessage
进行信息的传递和接收。
主线程与 Worker 之间传递的数据是通过拷贝完成的,而传址来完成的。传递给 Worker 的对象需要经过序列化,接下来在另一端还需要反序列化。页面与 Worker 不会共享同一个实例,最终的结果就是在每次通信结束时生成了数据的一个副本。
也就是说,Worker 与其主页面之间只能单纯的传递数据,不能传递复杂的引用类型:如通过构造函数创建的对象等。并且,传递的数据也是经过拷贝生成的一个副本,在一端对数据进行修改不会影响另一端。
缺点
worker
不支持跨域请求worker
不能访问document
和window
,但是可以获取navigator
、location(只读)
、XMLHttpRequest
、setTimeout
等浏览器 API。也可以进行AJAX
请求。
多个 worker
- 一个
worker
可以委派多个worker
// 加载其他的worker
importScripts('...')
- 使用
terminate()
可以终止worker