使用Worker子线程不阻塞处理数据
使用Worker子线程不阻塞处理数据
浮川的小窝

使用Worker子线程不阻塞处理数据

面壁人浮川
2023-03-02 / 0 评论 / 15 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年05月15日,已超过367天没有更新,若内容或图片失效,请留言反馈。

e94b19ecdd5c0921c152765c2350f1f2.jpeg


话接上文 顺嘴一提 因为业务场景中要使用到计算点位的重复数据(最low版 理想情况假设下GPS推送过来的点位 如果不动是完全一样的 但是实际场景中GPS即使不动 点位也会"飘" 不可能前后点位完全相同 所以这算是low逼版version0.1吧 后续点位推送过来在进行代码优化)
因为点位数据大 考虑到不阻塞主流程显示 采用了子线程异步加载 不耽误事 上代码~

    // 计算停留点点位 子线程计算
    const worker = new Worker();
    // 主线程给 worker 子线程发送数据
    ElMessage({
      message: "正在获取停留点终数据,请稍候",
      grouping: true,
      type: "warning",
      customClass: "command-message",
    });
    worker.postMessage({ trakCollection });
    // 打印其他点位
    // 主线程注册子线程的 postmessage 数据回调
    worker.onmessage = ({ data }: MessageEvent) => {
      try {
        // console.log("data.trakCollection",data)
        HBMap.drawOtherHistoryMarkers(data.trakCollection);
      } catch (err) {
        console.log(err);
      }
      setTimeout(() => {
        ElMessage({
          message: "获取停留点点位成功!",
          grouping: true,
          type: "success",
          customClass: "command-message",
        });
      }, 2000);
      // 主线程关闭 worker 子线程
      worker.terminate();
    };

// worker.js hook代码

import type { Coordinate } from "@/map";
import { ElMessage } from "element-plus";

self.onmessage = async ({ data }) => {
  const trakCollection = await handleCoordinateArr(data.trakCollection);
  self.postMessage({ trakCollection });
};

self.onerror = () => {
  // worker 线程发生了错误!
  ElMessage({
    message: "获取停留点终数据失败!",
    grouping: true,
    type: "error",
    customClass: "command-message",
  });
};

function handleCoordinateArr(arr: Coordinate[] = []): Promise<Coordinate[]> {
  const [start, ...args] = arr,
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    [end, ...argss] = [...args].reverse(),
    pauseSet = new Set();
  return new Promise((reslove) => {
    arr.reduce(
      (prv: Coordinate[], cur: Coordinate) => {
        if (prv.some((t) => t.toString() === cur.toString())) {
          pauseSet.add(JSON.stringify(cur));
          prv.push(cur);
        }
        return prv;
      },
      [arr[0]]
    );
    reslove([
      start,
      ...Array.from([...pauseSet]).map((pause) => JSON.parse(pause as string)),
      end,
    ] as Coordinate[]);
  });
}
  //
0

评论 (0)

取消