由于js是单线程语言,后来兴起的多核CPU导致单线程使用起来不方便。
所以,html5出来的web worker致力于解决单线程问题。
它相当于是在后台又开了一个线程,但是不影响主线程,这样做的目的是一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。
使用限制
- 同源
分配给worker的任务必须与主线程是同源的
- DOM限制
不可以使用
document / window / parent
对象,但是可以使用navigator / location
对象
- 通信联系
主线程和worker 不能直接联系,必须通过消息传输来进行联系
- 脚本限制
不可以使用
alert / confirm
,但是可以使用XMLHttpRequest
来发送AJAX请求
- 文件限制
不能打开本地文件,也不可以读取本地文件,文件必须来自网络
基本使用方法
1、 主线程
- 新建一个worker线程,并发送数据
const worker = new Worker(a.js);
worker.postMessage("hello world");
- 读取worker返回的数据
通过worker.onmessage指定一个监听事件
worker.onmessage = function (event) {
console.log('Received message ' + event.data);
doSomething();
}
检查worker是否有错误,有错误就会调用主线程的error方法
worker.addEventListener('error', function (event) {
- 关闭worker
worker.terminate()
2、worker
指定一个监听事件
self.addListerEvent('message',function (e){ //self代表woker的全局
e.date //指主线程传来的数据
self.postMessage() //向主线程发送数据
self.close() //用于自身关闭
})
可以加载其他脚本,使用importScripts()
importScripts('javascript1.js',('javascript2.js',...) //可以同时加载一个或多个脚本
网友评论