当前位置: 首页 > article >正文

封装一个web Worker 处理方法实现多线程

背景:

开启多线程处理一段耗时的逻辑

简化Worker使用

直接上代码:
以下是封装的函数直接复制即可

/**
     * 封装一个worker的启动函数 用于开启一个新的线程 来处理一些耗时的操作
     * @param {object} paremdata 传递给worker的参数
     * @param {function} callbackFun 回调函数
     * @param {function} getDataCallback 接收worker返回的数据的回调函数
     */
    function worderHandle ({
      paremdata = {},
      callbackFun = () => { },
      getDataCallback = () => { },
    }) {
      const myWorker = new Worker(funToBlobURL(worderFun))
      // 监听来自Worker的消息
      let data = {}
      myWorker.onmessage = function (e) {
        // console.log('收到来自Worker的消息:', e.data)
        getDataCallback(e.data)
      }
      myWorker.postMessage({
        data: {
          ...paremdata,
        },
        callbackFuns: callbackFun.toString()
      })
      // 此处的变量与外侧全局变量隔离 无法访问到的
      function worderFun () {
        self.onmessage = async function (e) {
          // console.log('收到来自主线程的消息:', e.data)
          let callbackFuns = eval(e.data.callbackFuns)
          try {
            let pdata = await callbackFuns(e.data.data)
            self.postMessage(pdata)
          } catch (error) {
            self.postMessage(error)
          }
        }
      }
      /**
       * 函数转异步链接
       * @param {string} message 要发送的消息
       */

      function funToBlobURL (fun) {
        if (!fun) {
          return ''
        }
        /**
       * 将文本内容转换为Blob URL
       * @param {string} textContent 文本内容
       * @returns {string} Blob URL
       */
        function txtToBlobURL (textContent = '这是一段示例文本') {
          // 创建Blob对象,指定MIME类型为'text/plain'
          const blob = new Blob([textContent], { type: 'text/plain' })
          // 创建指向该Blob对象的URL
          const blobUrl = URL.createObjectURL(blob)
          // console.log(blobUrl) // 输出Blob URL
          // 当不再需要Blob URL时
          setTimeout(() => {
            URL.revokeObjectURL(blobUrl)
          }, 0)
          return blobUrl
        }
        return txtToBlobURL(`(${fun.toString()})()`)
      }
    }

用法示例

let workData = {
      paremdata: {  // 传入的初始参数
        a: 123,
      },
      callbackFun: (res) => {  
        // 接收的是paremdata 的数据 由于 worder函数是独立的所以必须使用这种方式 注意此处无法访问当前环境的任何参数,只能使用 res 因此你必须在paremdata 传到这个函数才行  此方法支持同步和异步。一般耗时操作多为异步
        console.log('回调函数执行', res)
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            // reject('出错了')
            resolve(res.a + 100)
          }, 5000)
        })
      },
      getDataCallback: (res) => {
        // 接收callbackFun 返回的结果的   then和catch 都会到这里。 如果想区分可修改上面的方法。来满足自身的需求
        console.log('接收到的数据 getDataCallback执行', res)
      }
    }

    worderHandle(workData)

如有问题,可提出,共勉

注意:
该方法暂未做兼容,以下是兼容浏览器。
目测大部分主流浏览器都支持的。也无伤大雅
在这里插入图片描述


http://www.kler.cn/a/389145.html

相关文章:

  • Elastic Observability 8.16:增强的 OpenTelemetry 支持、高级日志分析和简化的入门流程
  • 以色列支付龙头遭DDoS攻击,各地超市加油站等POS机瘫痪
  • Web安全之SQL注入---基础
  • [CKS] 关闭API凭据自动挂载
  • python实战(八)——情感识别(多分类)
  • Python如何用正则表达式匹配并处理文件名
  • [python3] tornado 使用swagger编写接口文档
  • FastHtml llmctx介绍
  • Spring Boot与工程认证:计算机课程管理的新范式
  • 塔吉克斯坦媒体发稿:伊斯梅尔快讯的海外影响力-大舍传媒
  • javascript实现国密sm4算法(支持微信小程序)
  • SVN 提交操作
  • Flutter 正在切换成 Monorepo 和支持 workspaces
  • Jasypt 实现 yml 配置加密
  • GPU集群上分布式训练大模型
  • Allure入门介绍
  • qt实现多影像的匀光调整
  • 网络层5——IPV6
  • Oracle 第26章:Oracle Data Guard
  • MySQL 数据备份与恢复
  • 智能检测技术与传感器(热电传感器四个定律)
  • 状态模式(State Pattern)详解
  • 构造,CF 2029D - Cool Graph
  • HBase的架构介绍,安装及简单操作
  • Python数据分析案例64——杭帮菜美食探索数据分析可视化
  • GIF图片格式详解(三)