美文网首页
前端如何使用web worker发布setInterval任务

前端如何使用web worker发布setInterval任务

作者: Oo晨晨oO | 来源:发表于2021-04-20 15:55 被阅读0次

setTimeout 和 setInterval 会被浏览器自己的系统处理进行降速节约资源. 那么如何避免这个呢, 就用web worker来发布定时任务, 就可以避免浏览器自己的行为.

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

      function() {
        const intervalIds = {};

        // 监听message 开始执行定时器或者销毁
        self.onmessage = function onMsgFunc(e) {
          switch (e.data.command) {
            case 'interval:start': // 开启定时器
              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;
  },

  // 监听worker 里面的定时器发送的message 然后执行回调函数
  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里面发送销毁指令
  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. 在调用的地方
import workerTimer from '你的路径’

// 开启
const currentInterval = workerTimer.setInterval(() => {

fetchCurrentTableNameUser();
}, 30000);

// 注销
workerTimer.clearInterval(currentInterval);

大功告成.

相关文章

  • 前端如何使用web worker发布setInterval任务

    setTimeout 和 setInterval 会被浏览器自己的系统处理进行降速节约资源. 那么如何避免这个呢,...

  • web worker

    web Worker web Worker 文件单独写在一个文件中,在main worker 中 执行的文件里使用...

  • Web Worker使用

    最近对Web Worker进行了系统学习,主要看了阮大的教程[https://www.ruanyifeng.com...

  • web work

    Web Worker 什么是Web worker?为什么要用它?我们必须要先了解这些,才能更好的去使用这个技术。 ...

  • web worker的介绍和使用

    简介 什么是web worker呢?从名字上就可以看出,web worker就是在web应用程序中使用的worke...

  • HTML 5 Web Workers

    前端多线程 web worker 是运行在后台的 JavaScript,不会影响页面的性能。 什么是 Web Wo...

  • web worker 处理多文件并行上传

    一 web worker: 什么是web worker Web Worker为Web内容在后台线程中运行脚本提供...

  • 在vue中怎么使用Web Worker

    在vue项目中不能直接使用web worker,需要使用vue-worker这个库。它提供了run、create等...

  • 如何优雅的使用Web Worker

    欢迎star:complex-calculations-worker Web Worker是HTML5中提出的概念...

  • Javascript:Web Worker基础

    参考资料Web Workersweb worker详解Blob对象 Web Worker分为专属Worker(De...

网友评论

      本文标题:前端如何使用web worker发布setInterval任务

      本文链接:https://www.haomeiwen.com/subject/ajynlltx.html