前端如何使用web worker發(fā)布setInterval任務(wù)

setTimeout 和 setInterval 會(huì)被瀏覽器自己的系統(tǒng)處理進(jìn)行降速節(jié)約資源. 那么如何避免這個(gè)呢, 就用web worker來發(fā)布定時(shí)任務(wù), 就可以避免瀏覽器自己的行為.

  1. 新建一個(gè)js文件, 放入worker工作本體 (自己格式化一下)
// Build a worker from an anonymous function body
const blobURL = URL.createObjectURL(
  new Blob(
    [
      '(',

      function() {
        const intervalIds = {};

        // 監(jiān)聽message 開始執(zhí)行定時(shí)器或者銷毀
        self.onmessage = function onMsgFunc(e) {
          switch (e.data.command) {
            case 'interval:start': // 開啟定時(shí)器
              const intervalId = setInterval(function() {
                postMessage({
                  message: 'interval:tick',
                  id: e.data.id,
                });
              }, e.data.interval);

              postMessage({
                message: 'interval:started',
                id: e.data.id,
              });

              intervalIds[e.data.id] = intervalId;
              break;
            case 'interval:clear': // 銷毀
              clearInterval(intervalIds[e.data.id]);

              postMessage({
                message: 'interval:cleared',
                id: e.data.id,
              });

              delete intervalIds[e.data.id];
              break;
          }
        };
      }.toString(),

      ')()',
    ],
    { type: 'application/javascript' },
  ),
);

const worker = new Worker(blobURL);

URL.revokeObjectURL(blobURL);

const workerTimer = {
  id: 0,
  callbacks: {},
  setInterval: function(cb, interval, context) {
    this.id++;
    const id = this.id;
    this.callbacks[id] = { fn: cb, context: context };
    worker.postMessage({
      command: 'interval:start',
      interval: interval,
      id: id,
    });
    return id;
  },
  setTimeout: function(cb, timeout, context) {
    this.id++;
    const id = this.id;
    this.callbacks[id] = { fn: cb, context: context };
    worker.postMessage({ command: 'timeout:start', timeout: timeout, id: id });
    return id;
  },

  // 監(jiān)聽worker 里面的定時(shí)器發(fā)送的message 然后執(zhí)行回調(diào)函數(shù)
  onMessage: function(e) {
    switch (e.data.message) {
      case 'interval:tick':
      case 'timeout:tick': {
        const callbackItem = this.callbacks[e.data.id];
        if (callbackItem && callbackItem.fn)
          callbackItem.fn.apply(callbackItem.context);
        break;
      }

      case 'interval:cleared':
      case 'timeout:cleared':
        delete this.callbacks[e.data.id];
        break;
    }
  },

  // 往worker里面發(fā)送銷毀指令
  clearInterval: function(id) {
    worker.postMessage({ command: 'interval:clear', id: id });
  },
  clearTimeout: function(id) {
    worker.postMessage({ command: 'timeout:clear', id: id });
  },
};

worker.onmessage = workerTimer.onMessage.bind(workerTimer);

export default workerTimer;
  1. 在調(diào)用的地方
import workerTimer from '你的路徑’

// 開啟
const currentInterval = workerTimer.setInterval(() => {

fetchCurrentTableNameUser();
}, 30000);

// 注銷
workerTimer.clearInterval(currentInterval);

大功告成.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 開始之前,代碼在這里。歡迎各位大神指導(dǎo)。 在 Web Worker 之前,解析 CSS,生成布局,繪制界面以及運(yùn)行...
    uncle_charlie閱讀 2,460評(píng)論 0 1
  • 1.HTML語(yǔ)義化的理解和作用? 理解:根據(jù)具體內(nèi)容,選擇合適的標(biāo)簽(每個(gè)標(biāo)簽都有自己特定的語(yǔ)義)進(jìn)行代碼的編寫。...
    Anon_0507閱讀 846評(píng)論 0 0
  • 介紹 JavaScript 屬于單線程環(huán)境,無論你運(yùn)行多少腳本生成多少事件 亦或者使用setTimeout(),s...
    mmmm4m閱讀 9,095評(píng)論 0 2
  • 前言開門見山,這篇文章,適合 「 初級(jí)前端 」 ,如果你還在校招的話,或者還在求職的話,可以看看本文,找一找靈感,...
    WEB前端含光閱讀 1,401評(píng)論 1 2
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    余生動(dòng)聽閱讀 10,810評(píng)論 0 11

友情鏈接更多精彩內(nèi)容