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

react中防止数据多大并需要二次加工处理进行单线程转多线程webworker优化处理(不借助react-webworker)

需求背景

在开发中 有的需求往往和分页等会产生冲突  比如批量修改后又进行自定义修改  后端无法获取前置更改等  这个时候不分页数据量会很大而且需要我们对数据进行二次加工  然后需要我们进行优化处理   这就可以采取webworker多线程处理了  下面是一个没有借助react-webworker插件的原生简单例子

实现过程

即粘即用   逻辑步骤我都写在代码注释里面了 

这是我的目录结构  worker.js为我创建的多线程处理文件   选中的为我使用的文件地址

worker.js页面

// 定义worker线程脚本代码
const workercode = () => {
  self.onmessage = function (e) {
      //e为通信传入的对象


      //这里写需要对数据处理加工的内容
      //例子
      const result=[]
      result=e.data.map(item=>item.name)


      //发送回去
      self.postMessage(result);
  };
};
//为了将workerCode函数转化为一个可由Worker构造函数使用的URL,将该函数转换为字符串,并从中提取函数体。接着,使用此函数体内容创建一个Blob对象,并通过URL.createObjectURL创建一个指向该Blob的URL。 把脚本代码转为string
let code = workercode.toString();
code = code.substring(code.indexOf('{') + 1, code.lastIndexOf('}'));

const blob = new Blob([code], { type: 'application/javascript' });
const worker_script = URL.createObjectURL(blob);

module.exports = worker_script;

使用页面

//1.引入
import worker_script from './worker.js';


//2.定义
const worker = new Worker(worker_script);



//3.发送数据及接收  我这边直接放入一个例子  核心内容会标注

  const applyData = useCallback(
    async (num, urlFilterLevelLists, wall) => {
      //开启loading
      setSpinLoading(true);
      try {
        // 获取原始数据
        const res = await getApplyList(cpeId);

        // 将数据发送到 Web Worker 处理
        worker.postMessage({
          data: res,
          wall,
          urlFilterLevelLists,
          num,
          level,
        });

        // 监听 Web Worker 的返回结果
        worker.onmessage = (e) => {
          const { processedData, idMap } = e.data;
          batchUpdates(() => {
            setExpandedRowKeys(Array.from(idMap.values()));
            setApplyDataSource(processedData);
          });
        };
      } finally {
        //结束loading
        setSpinLoading(false);
      }
    },
    [cpeId],
  );

注:期间在worker.js中写逻辑时  定义函数等因为闭包需要写到onmessage内    里面foreach/for in写法可能会导致报错  写成for即可   若遇到报错promise未定义等 大概率是通信没有成功

相关文章:

  • Python Sanic面试题及参考答案
  • 东软鸿蒙C++开发面经
  • 网络华为HCIA+HCIP 防火墙
  • VLAN综合实验实验报告
  • git的进阶使用
  • Spring Boot JSON序列化深度管控:忽略指定字段+Jackson扩展策略破解双向实体循环引用问题
  • Linux -- 进程间通信(IPC)-- 进程间通信、管道、system V 共享内存、system V 消息队列、责任链模式 、system V 信号量
  • AI与数据的双向奔“赋”
  • 超融合服务器与普通服务器的具体区别
  • 226.翻转二叉树
  • ubuntu20.04 修改输入法设置后 界面卡死终端乱码 解决方法
  • 23中设计模式-迭代器(Iterator)设计模式
  • Netty源码—Pipeline和Handler(二)
  • Day39 | 724. 寻找数组的中心下标、34. 在排序数组中查找元素的第一个和最后一个位置、922. 按奇偶排序数组 II、35. 搜索插入位置
  • 如何用腾讯云建站做好一个多语言的建筑工程网站?海外用户访问量提升3倍!分享我的经验
  • 加新题了,MySQL 8.0 OCP 认证考试 题库更新
  • 通信系统的性能指标
  • MySql INDEX
  • Python:进程池,同步和异步,进程池通信示例
  • 集星獭 | 平滑适配多系统打通商管业财数据脉络
  • 做php网站教程/深圳优化公司哪家好
  • 简述网站开发的流程/广告投放平台有哪些
  • 网站免费服务器/线上推广平台哪些好
  • 杭州电子商务公司排行/网站推广和seo
  • 代做设计网站/长沙网站seo推广
  • 旅游网站组织结构图怎么做/设计网站排名