web worker实现xx分钟不操作后,页面失效

预设条件

  • 静默时长:10分钟;
  • 页面失效,返回首页
  • 10分钟内有操作,则重新计时
  • 同一表单页,仅支持唯一一方操作,其他方预操作

实现思路

10分钟的统计通常情况下会使用setInterval(),但是由于setInterval()计时会有一定误差,设置在浏览器处于非激活状态下可能会以极慢的速度工作甚至停止计时,因此,本文采用web worker新建线程来准确计时。

Web Worker

Web Worker:HTML5标准的一部分,允许我们在js主线程之外开辟新的一个线程,并且将一段js脚本运行其中,使其与主线程同步进行,互不阻塞。所以,目前很多在js主线程只专注处理业务逻辑,Worker线程负责计算等复杂任务,提高运行效率、页面流畅度等。

注意

  • Worker 线程中不可操作DOM对象、不可访问window对象;

  • Worker 的顶层对象:self

  • 使用:new Worker(path, options)

    • path:有效的js脚本地址(遵守同源策略)
  • 关闭Workerworker.terminate()

  • postMessage()传递的数据支持:由结构化克隆算法处理的任何值或JS对象,包括循环引用。

实现方法

  1. public 文件夹下,新建Worker.js文件
js 复制代码
// 监听 接收消息
let timer;
self.addEventListener('message', e => { // 接收到消息
    console.log(e.data); 
    
    let sum = 0;
    let msg;
    
    if (e.data === "start") {
        // 每分钟 sum 加 1 标识积累了 1 分钟
         timer = setInterval(() => {
            sum += 1;
            msg = {
                text: 'editing',
                sum
            }
            // 向主线程发送消息 msg 对象
            self.postMessage(msg); 
         }, 60 * 1000) 
    } else {
        clearInterval(timer);
    }
});


// worker内部错误
self.addEventListener('error', err=>{
    cosole.log(err)
})
// 消息体无法被反序列化时
self.addEventListener('messageError', err=>{
    cosole.log(err)
})
  1. Vue组件中创建并使用Worker.js
js 复制代码
<template>
    <el-form>
        ...表单内容
    </el-form>
<template>

<script>
export default {
    data:_=>({
        worker: null
    }),
    created() {
        this.startWorker();
    },
    activated() {
        this.onTimerReset()
    },
    methods: {
        // 开启worker
        startWorker() {
           // 判断浏览器兼容性
           if(typeof Worker !== 'undefind') {
                // 创建Worker实例
                this.worker = new Worker('./Worker.js');
                this.handleWorker()
            } else {
                console.log('Your browser does not support Web Workers.')
            } 
        },
        stopWorker() {
            if(this.worker) {
                this.worker.terminate();
                this.worker = null;
            }
        },
        handleWorker() {
            const selfWorker = this.worker
            selfWorker.postMessage('start timer')
            
            // 监听 来自 worker的 message 消息
            selfWorker.onmessage = e => {
                this.handleWorkerMsg(e.dada)
            }
        },
        // 开启计时
        onTimerSatrt() {
            this.worker.postMessage('start timer')
        },
        // 关闭计时
        onTimerEnd() {
            this.worker.postMessage('start end')
        },
        // 重新计时
        onTimerReset() {
            this.onTimerEnd()
            this.onTimerSatrt()
        },
        // 处理数据
        handleWorkerMsg(data) {
            console.log(data); // {text: 'editing', sum: sum} 
            campaignListLock(); // 发起续租请求
            
            if(data.sum >10) {
                this.onTimerEnd();
                if (document.visibilityState === "visible") { 
                    message.error("页面已失效"); 
                    pageGoBack(); 
                    // 触发了提示就禁止它后续再触发 
                    timeCount = 1;
                } 
                document.addEventListener("visibilitychange", function () { 
                    if (document.visibilityState == "visible" && timeCount == 0) { 
                        message.error("页面已失效"); 
                        pageGoBack(); 
                        // 触发了提示就禁止它后续再触发
                        timeCount = 1; 
                    }
                });
            }
        },
    },  
    beforeDestroy() {  
        // 在组件销毁前停止 Worker,避免内存泄漏  
        this.stopWorker();  
    },  
}
</script>
相关推荐
咩咩啃树皮2 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny2 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹2 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny3 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
小林ixn3 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker4 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜4 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康4 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
一点一木5 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github
IT_陈寒6 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端