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

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.data
  switch (action) {
    case 'startTimer':
      startTimer(id, interval)
      break
    case 'stopTimer':
      stopTimer(id)
      break
    case '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] = fun
      this.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 = worker
      this.timers = {}
    }
    return this
  }
  terminate() {
    if (this.worker) {
      this.stopAllTimers()
      this.worker.terminate()
      this.worker = undefined
      this.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.kler.cn/a/302627.html

相关文章:

  • 越南很火的slots游戏投放Google谷歌广告策略
  • IC 脚本之python
  • 网络技术-定义配置ACL规则的语法和命令
  • C++STL容器——map和set
  • arcgis做buffer
  • 安全见闻1-5
  • 25届计算机专业选题推荐-基于微信小程序的校园快递驿站代收管理系统
  • 修改docker的默认存储位置及镜像存储位置
  • 无人机低空安全管控系统技术详解
  • 2024年9月13日随笔
  • c++中extern “C“的作用及理解
  • 【FFMPEG】FFplay音视频同步分析(下)
  • 仕考网:2525年国考时间是什么时候?
  • Maven基本使用(下)
  • 无头服务(Headless Service)
  • 按图搜索的实时性:阿里巴巴拍立淘API返回值的快速响应
  • 学懂C++(五十六): 深入理解MFC框架、底层原理及消息映射机制
  • openstack之glance介绍
  • 智能体-AI-Agent-简介
  • MATLAB求解0-1线性规划问题的详细分析
  • k8s笔记——kubebuilder实战
  • 基于深度学习的线性预测:创新应用与挑战
  • 华纳云:修复WordPress内存耗尽错误的常用方法有哪些?
  • Linux操作系统入门(二)
  • Android 车联网——CarProperty使用实例(二十三)
  • 结构开发笔记(八):solidworks软件(七):装配图中让摄像头绕轴旋转起来