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

2024-04-10 17:20

本文主要是介绍使用 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路径方面;

这篇关于使用 Web Workers 作为setInterval的替代方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891679

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1