当前位置:   article > 正文

vue解决缩小浏览器后倒计时不准确的问题

vue解决缩小浏览器后倒计时不准确的问题

使用web worker

首先安装一下worker-loader

npm i -D worker-loader

 其次在vue.config.js里配置一下worker-loader

  1. module.exports = defineConfig({
  2. transpileDependencies: true,
  3. chainWebpack(config) {
  4. config.module
  5. .rule('worker')
  6. .test(/\.worker\.js$/)
  7. .use('worker-loader')
  8. .loader('worker-loader')
  9. .end();
  10. config.module.rule('js').exclude.add(/\.worker\.js$/)
  11. },
  12. })

创建一个web worker的文件 timer.worker.js

  1. //webworks.js 监听主线程传递的 开始时间+目标时间(this.value)
  2. self.onmessage = function(event) {
  3. console.log("监听到的组件传过来的最终时间", event.data);
  4. let targetDate = event.data;
  5. // 定义一个递归函数,模拟 setInterval
  6. function countdown() {
  7. // 目前时间
  8. const currentTime = Math.floor(Date.now() / 1000);
  9. // 时间差等于,最终目标时间-当前时间
  10. let timeDifference = targetDate - currentTime;
  11. console.log("传给组件的最终时间和现在时间的差值", timeDifference);
  12. // 将剩余时间发送回主线程,还剩多少时间
  13. self.postMessage(timeDifference > 0 ? timeDifference : 0);
  14. // 如果剩余时间小于等于0,则结束递归
  15. if (timeDifference <= 0) {
  16. return;
  17. }
  18. setTimeout(countdown, 1000);
  19. }
  20. // 调用递归函数
  21. countdown();
  22. };

组件那边首先引入worker文件

import Worker from "@/core/timer.worker.js";

在组件方法里使用

  1. let endTime = Math.floor(Date.now() / 1000) + this.value;//这是结束时间
  2. const worker = new Worker();//实例化worker线程
  3. worker.postMessage(endTime);//把目标时间传到worker.js里去
  4. // 主线程监听 Web Worker 的消息
  5. worker.onmessage = (event) => {
  6. console.log(event, "event");
  7. //this.value是当前倒计时剩余时间
  8. this.value = event.data;
  9. console.log(this.value, "remainingTime");
  10. //如果剩余时间结束则停止线程
  11. //Worker线程被终止,就无法重新启动或恢复其执行。
  12. this.getTime(this.value);
  13. //如果倒计时减少到0了
  14. if (!this.value) {
  15. //你的播放提示音?或者什么的行为
  16. worker.terminate();//最后停止worker线程
  17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/118993
推荐阅读
相关标签
  

闽ICP备14008679号