使用 Web Workers 作为setInterval的替代方案

使用 Web Workers 作为setInterval的替代方案

Vue 项目中,为了避免 setInterval 在标签页非激活状态下的不准确问题,我们可以使用 Web Workers 作为一个替代方案

Web Worker 介绍:

Web Workers :

  1. 浏览器后台为网页运行的一个小助手,它可以在不干扰网页当前页面显示和交互的情况下,独立地执行一些任务

  2. Web Workers的运行是独立于主线程的,这意味着即使它们在后台进行重量级计算,也不会影响到你滚动网页、点击按钮等操作的流畅性

  3. 理解为浏览器中的一个轻量级的“后台进程”

  4. 不能直接访问DOM(文档对象模型),这意味着你不能在 Worker 里直接修改网页的内容;

  5. 可以通过发送消息的方式与主线程通信,比如让 Worker 处理完任务后,将结果发送回主线程,然后由主线程来更新网页内容

步骤 1: 创建 Web Worker 文件

首先,你需要创建一个 Web Worker 脚本文件。命名为 timerWorker.js,并放置以下代码:

// timerWorker.js
let intervalId = null;

self.addEventListener('message', e => {
  const { type, interval } = e.data;
  // 监听消息类型为'start'(你自定义的类型)
  if (type === 'start') {
    if (intervalId !== null) {
      clearInterval(intervalId);
    }
    intervalId = setInterval(() => {
      // 建立setInterval计时器,向主线程发送消息
      self.postMessage('tick');
    }, interval);
  } else if (type === 'stop') {
    if (intervalId !== null) {
      clearInterval(intervalId);
      intervalId = null;
    }
  }
});

步骤 2: 在 Vue 组件中使用 Web Worker

在你的 Vue 组件中,你可以如下使用 Web Worker

<template>
  <div>
    <p>计时器 ticks: {{ ticks }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      ticks: 0,
      worker: null,
    };
  },
  mounted() {
    if (window.Worker) {
      this.worker = new Worker(process.env.BASE_URL + 'timerWorker.js');
      // 设置接收到/timerWorker.js消息时的执行函数;
      this.worker.onmessage = this.cbDo;
      // 发送start类型消息
      this.worker.postMessage({ type: 'start', interval: 1000 });
    }else{
        // 考虑添加退回方案
        alert('浏览器不支持');
    }
  },
  beforeDestroy() {
    if (this.worker) {
      this.worker.terminate();
    }
  },
  methods: {
    cbDo(msg) {
      // 计时到,你要做的事
    },
  },
};
</script>

注意事项

  1. ✅ 这里 process.env.BASE_URLVue CLI提供的一个环境变量,它会根据你的项目配置返回正确的基路径;确保即使你的应用部署在子路径下,引用的路径也是正确的
  2. ✅ 确保Web Worker文件 (timerWorker.js) 的路径正确,如果使用 Vue CLI,可以将它放在 public 目录下。
  3. ✅ 在 Web Worker 和主线程之间使用消息传递来启动、停止定时器,以及接收定时器的“tick”消息。
  4. ✅ 使用这种方法,即使在浏览器标签页处于非激活状态时,定时器也能保持较高的准确性,避免了传统定时器 setInterval 的问题。

可能遇到的问题

  1. 🔴 timeworker.js文件报错Uncaught SyntaxError: Unexpected token '<' :考虑timerWorker.js路径方面;
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值