在Vue环境下利用worker运行interval计时器的步骤


Posted in Javascript onAugust 01, 2019

今天在code review时,发现之前遗留的问题:

在一个视频播放页面,有一个40ms的interval一直在阻碍,导致视频延时逐渐增大

于是写了一个worker单独把计时器拉出去跑了

实现步骤如下

由于用的是vue-cli,在webpack下要安装worker-loader依赖才能单独加载worker.js

npm install worker-loader --save-dev

更改 vue.config.js 文件的配置项

configureWebpack:{
  module: {
    rules: [
      {
        test: /\.worker\.js$/,
        loader: 'worker-loader',
        options: {
         inline: true,
         fallback: false,
         name: '[name]:[hash:8].js'
        }
      }
    ]
  },
}

注意,worker-loader配置项一定要写在js-loader的前边,否则报错。

下面写封装的方法,为了适配多计时器的情况,需要建一个class类

/**
 * worker类
 * export定时器方法
 * 
 */
export class workerTimer {
  constructor(){
     
  }
  timeInterval(name,interval,_this){
    console.log(name+'计时器已建立');  
    this[name] = setInterval(() => {
      _this.postMessage({name:name,message:interval/1000+'秒到了'})
    },Number(interval))
  }
}

然后用worker主方法调用这个类,e为组件内传入的计时器数组

import {workerTimer} from './workerTimer'
/**
 *通过遍历器遍历参数
 *new出新的worker类
 *调用定时器方法
 */
self.onmessage = function (e) {
  e.data.map((item) => {
   let workertimer = new workerTimer()
   workertimer.timeInterval(item.name,item.interval,self)
  })
};

在vue组件内引入worker

import Worker from './worker.js'

在methods里写一个方法,名字随便起

workerInit(){
  this.worker = new Worker();
  this.worker.postMessage(this.workerList);
  this.worker.onmessage = (params) => {
    ...
  }
},

在data里创建一个变量,格式如下:

workerList:[
  {name:'snapInterval',interval:10000},
  {name:'intervalFunc',interval:40}
],

在某个钩子内调用worker方法

mounted(){
  this.workerInit()
}

以上,具有两个定时器的work就建立好了,在主线程内可以通过worker传回的name来判断来触发回调。

销毁worker也很简单,只需要在destory时钩子里写上

this.worker.terminate();

即可

总结

以上所述是小编给大家介绍的在Vue环境下利用worker运行interval计时器的步骤,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Prototype中dom对象方法汇总
Sep 17 Javascript
js checkbox(复选框) 使用集锦
Apr 28 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
Oct 11 Javascript
js实现仿qq消息的弹出窗效果
Jan 06 Javascript
js实现不重复导入的方法
Mar 02 Javascript
JQuery解析XML的方法小结
Apr 02 Javascript
深入理解关于javascript中apply()和call()方法的区别
Apr 12 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
Nov 25 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
Sep 18 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
May 16 Javascript
微信小程序左滑动显示菜单功能的实现
Jun 14 Javascript
原生JS与JQ获取元素的区别详解
Feb 13 Javascript
详解Vue2.5+迁移至Typescript指南
Aug 01 #Javascript
微信小程序组件传值图示过程详解
Jul 31 #Javascript
vue.js实现回到顶部动画效果
Jul 31 #Javascript
vue实现滑动超出指定距离回顶部功能
Jul 31 #Javascript
Vue实现回到顶部和底部动画效果
Jul 31 #Javascript
详解mpvue实现对苹果X安全区域的适配
Jul 31 #Javascript
vue将后台数据时间戳转换成日期格式
Jul 31 #Javascript
You might like
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
轻松掌握python设计模式之策略模式
2016/11/18 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
Python容器类型公共方法总结
2020/08/19 Python
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
网吧消防安全制度
2014/01/28 职场文书
八一演出活动方案
2014/02/03 职场文书
法定代表人授权委托书
2014/04/04 职场文书
文明生主要事迹
2014/05/25 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
大学军训自我鉴定大全
2014/09/18 职场文书
应急管理工作总结2015
2015/05/04 职场文书
员工手册编写范本
2015/05/14 职场文书
工程进度款催款函
2015/06/24 职场文书
2015年物流客服工作总结
2015/07/27 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python