关于Web Worker应用

1、Web Worker介绍

Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。

Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。

2、Web Worker注意事项

1、同源限制

分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。

2、DOM 限制

Worker 线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的 DOM 对象,也无法使用document、window、parent这些对象。但是,Worker 线程可以navigator对象和location对象。

3、通信联系

Worker 线程和主线程不在同一个上下文环境,它们不能直接通信,必须通过消息完成

4、脚本限制

Worker 线程不能执行alert()方法和confirm()方法,但可以使用 XMLHttpRequest 对象发出 AJAX 请求。

5、文件限制

Worker 线程无法读取本地文件,即不能打开本机的文件系统(file://),它所加载的脚本,必须来自网络。

3、代码

1、编写worker.js的代码
//监听message事件
self.addEventListener('message', function (e) {
	let data = e.data;
	let type = data.type;
	let list = data.list;
	switch(type){
		case 'device': 
		    //触发postMessage,传输相关数据,通过type区分相关的事件类型,对数据做不同的处理
			this.self.postMessage({
				type: type,
				list: getDevice(list)
			});
			break;
		case 'pkCompany': //对比公司数据是否刷新
			this.self.postMessage({
				type: type,	
				data: pkCompany(list,data.msg),
			});
			break;
		case 'pkDevice': //对比设备数据
			this.self.postMessage({
				type: type,
				data: pkDevice(list,data.msg)
			});
			break;
		default: break;
	}

}, false);
//通过设备的二次码状态计算,一个设备的状态,若某个点(相关经纬度有多个设备),通过设备列表计算,该点的状态
const getDevice = (list) => {
    
    //在这里进行相关计算,返回需要的数据
    
    return ...;
}
//相关计算方法
...
2、导入上面的js文件,创建Worker
//开启新线程用于计算相关数据
created() {
    this.startWorker();
}
methods:{
    startWorker(){
        this.worker = new Worker('./static/script/worker.js');
        this.workerOnMessage();
    },   
}
3、页面传输数据到worker.js中
//获取报警消息
getAlarmDeviceInfo(){
    let params = {};
    $xh.http({
        type: 'get',
        url: url,
        params: params
    })
    .then(res=>{
        let list = res.data;
        this.worker.postMessage({
            type: 'device',
            list: list,
            msg: {}
        });
    })
    .catch(err=>{
        console.log(err);
    })
},
4、监听线程返回的数据
//监听新线程传回来的数据
workerOnMessage(){
    this.worker.onmessage = (e)=>{
        let data = e.data;
        let type = data.type;
        let list = [];
        switch(type){
            case 'device': 
                this.markerDeviceData = data.list;
                this.addMarkerDevice();
            break;
            case 'pkCompany':
                let companyObj = data.data;
                if(companyObj.list.length === 0)return;
                if(this.selectUser.type === 2)return;
                if(companyObj)
                this.updatedCompanyMarker(companyObj);
            break;
            case 'pkDevice':
                let deviceObj = data.data;
                if(deviceObj.indexList.length === 0)return;
                this.updatedDeviceMarker(deviceObj);
            break;
            default:break;
        }
    }
},
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值