当前位置: 首页 > news >正文

vue2中使用web worker启动定时器

vue2中使用web worker启动定时器,避免浏览器最小化或切换标签页时定时器不能按设定周期执行【一般是周期小于60s时,大于60s一般可正常执行】

  • 1、添加worker-loader
  • 2、修改vue.config.js
  • 3、创建timer.worker.js
  • 4、创建TimerWorker.js
  • 5、使用TimerWorker启动定时任务

1、添加worker-loader

npm install worker-loader --save

2、修改vue.config.js

新增以下配置

 config.module.rule('workers').test(/\.worker\.js$/).use('worker-loader').loader('worker-loader').options({inline: 'fallback'  // 尝试内联,失败则回退到默认行为})

3、创建timer.worker.js

self.timers = {}self.onmessage = function(event) {const { action, id, interval } = event.dataswitch (action) {case 'startTimer':startTimer(id, interval)breakcase 'stopTimer':stopTimer(id)breakcase 'stopAllTimers':stopAllTimers()break}
}function startTimer(id, interval) {if (!self.timers[id]) {self.timers[id] = setInterval(() => {self.postMessage({ id })}, interval)}
}function stopTimer(id) {if (self.timers[id]) {clearInterval(self.timers[id])delete self.timers[id]}
}function stopAllTimers() {Object.keys(self.timers).forEach(id => {clearInterval(self.timers[id])})self.timers = {}
}

4、创建TimerWorker.js

import Worker from './timer.worker.js'export default class TimerWorker {worker;timers;constructor() {this.start()}startTimer(id, interval, fun) {if (this.worker && !this.timers[id]) {this.timers[id] = funthis.worker.postMessage({ action: 'startTimer', id, interval })}return this}stopTimer(id) {if (this.worker && this.timers[id]) {this.worker.postMessage({ action: 'stopTimer', id })delete this.timers[id]}return this}stopAllTimers() {if (this.worker) {this.worker.postMessage({ action: 'stopAllTimers' })this.timers = {}}return this}start() {if (!this.worker) {const worker = new Worker()worker.onmessage = (event) => {this.timers[event.data.id]()}this.worker = workerthis.timers = {}}return this}terminate() {if (this.worker) {this.stopAllTimers()this.worker.terminate()this.worker = undefinedthis.timers = undefined}return this}
}

5、使用TimerWorker启动定时任务

import TimerWorker from './TimerWorker'export default {...created() {this._timerWorker = new TimeWorker()this.startTimer()},beforeDestroy() {this._timerWorker.terminate()},methods: {startTimer() {this._timeWorker.startTimer('test', 100, () => {console.log(new Date().getTime())})}}...
}

http://www.mrgr.cn/news/24692.html

相关文章:

  • 人工智能在现代科技中的应用和未来发展趋势
  • web知识
  • CC工具箱使用指南:【字段计算器学习版】
  • [数据集][目标检测]高铁受电弓检测数据集VOC+YOLO格式1245张2类别
  • Computer Vision的学习路线
  • 第二期: 第一节 环境的搭建
  • Ensure `ZZ_p::init(modulus)` is Called in Each Thread When Using NTL‘s `ZZ_p`
  • 泛型的使用详解
  • 启动配置管理一步搞定!体验元数据服务公测版,获得新一代配置管理体验
  • eNUM 原理概述(VoNR VoLTE适用) eNUM 报文解析
  • 故障恢复(残次版)
  • Encountered 31 files that should have been pointers, but weren‘t:(已解决,无废话)
  • 2024/9/11黑马头条跟学笔记(七)
  • linux测试网络连通性的命令
  • erlang学习: Mnesia Erlang数据库3
  • 使用jackson将xml和对象、List相互转换
  • 有用的批量合并视频重命名以及有用的提取音频。遍历指定文件夹下所有视频文件,先合并归一化再生成包含包含说话人的srt格式的文件
  • 如何高效阅读论文呢???
  • 什么是Kubernetes Service?
  • C++:sort自动排序函数