
Web Workers 使用
使用场景
- 耗时,后台下载
- 大量复杂计算,数据处理
- 实时通信
- 解决主线程耗时造成的阻塞问题
在 worker 线程中你可以运行任何你喜欢的代码,不过有一些例外情况。比如:在 worker 内,不能直接操作 DOM 节点,也不能使用 window 对象的默认方法和属性。但是你可以使用大量 window 对象之下的东西,包括 WebSockets,以及 IndexedDB 等数据存储机制!
使用postMessage和onMessage进行通信!
worker
1 2 3 4
| if (window.Worker) { }
|
主线程中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const worker = new Worker('worker.js',{name: 'worker'})
worker.postMessage(data)
worker.onMessage = (data) => { console.log('来自子线程的数据',data) }
worker.onerror = (err) => {}
worker.close()
|
子线程worker:
1 2 3 4 5 6 7 8 9 10 11 12
| self.onmessage = (data) => { console.log('主线程发送过来的数据',data) }
self.postMessage(data)
self.onerror = (err) => {}
self.close()
|
引入脚本:
1 2 3 4 5
| importScripts(); importScripts("foo.js"); importScripts("foo.js", "bar.js"); importScripts("//example.com/hello.js");
|
共享worker
https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API/Using_web_workers#web_workers_api