JS: 使用new worker 创建线程来处理倒时计

需求: 3分钟内收不到消息就默认超时,收到数据就重新计时

// timeOutWorker.js

// 最大时间:(180s即3min)
const MaxCount =  3 * 60;

// 间隔时间(5s)
const TimeGap = 5;

// 间隔定时器
let intervalTimer = null;

// 当前计时
let currentCount = null;

/**
 * 清除定时器
 *
 */
const clearTimerFn = () => {
  clearInterval(intervalTimer);
  intervalTimer = null;
  currentCount = null;
}
/**
 * 监听主线程发来的消息
 * action.type: start-开始计时,stop-停止记时
 * @param e
 */
self.onmessage = e => {
  const { action } = e.data;
  if (action ==='start') {
    // 每次收到消息,更新当前值为最大值;
    currentCount = MaxCount;
    if (!intervalTimer) {
      // 设置定时器: 每隔TimeGap 秒,当前值减TimeGap ,当前值小于0时,说明已经过了3分钟
      intervalTimer = setInterval(() => {
        currentCount -= TimeGap;
        if (currentCount <= 0) {
          // 3mim内收不到消息,默认掉线,发送"close",并且清除定时器
          self.postMessage({ type: 'close'});
          clearTimerFn();
        }
      }, TimeGap * 1000);
    }
  } else {
    clearTimerFn();
  }
};

// 主线程

import timeOutWorkerRaw from './timeOutWorker.js?raw';

const blob = new Blob([timeOutWorkerRaw], { type: 'application/javascript' });
const workUrl = window.URL.createObjectURL(blob );
const TimeOutWorker = new Worker(workUrl );

// 监听来自 Worker 的消息
TimeOutWorker.onmessage = function (event: MessageEvent) {
 // 接收到来自子线程的消息close
  if (event.data.type === 'close') {}
};
//  开始方法
function startFn() {
// 给子线程发送消息
  TimeOutWorker.postMessage({ 'start'});
}
//  结束方法
function stopFn() {
// 给子线程发送消息
  TimeOutWorker.postMessage({ 'stop'});
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值