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

Vue3 + Vite + TS,使用 Web Worker,web worker进阶 hooks

worker 具体通讯方式

1.由 web page 发送消息
	- worker.postMessage(发送数据)
2.web worker 接收消息并执行相关逻辑
	- onmessage = (e) => { 
		接收数据并处理逻辑
		postMessage(传递处理后的数据)
	  }
3.由 web page 监听 worker 消息,包括:
	- 处理数据的监听
		worker.onmessage = (得到处理的数据)=> {}
	- 执行中报错监听
		worker.onerror = (报错信息) => {}

Web Workers API 传送门

添加web worker - worker.ts

// 文件存储位置没具体固定,作者放在src/
onmessage = (e) => {
    console.log('发送来的数据'+e)
    postMessage(e)
}

引入、通信、监听报错、销毁

import MyWorker from '@/workers/index?worker'
const worker = new MyWorker()
// 向 Web Worker 发送数据
worker.postMessage({ type:'search2' })
//监听 Web Worker 返回的数据,并销毁
worker.onmessage = async (e) => {
    worker.terminate()
    console.log('接收数据'+e)
}
// 监听报错
worker.onerror = (err) => {
  	console.error('Worker error:', err)
    worker.terminate()
}

new Blob

// 将一个函数转换为 blob,然后为这个 blob 生成 URL 对象
function fn2workerURL(fn) {
  const blob = new Blob([`(${fn.toString()})()`], { type: "text/javascript" });
  return URL.createObjectURL(blob);
}

new Worker

// 指定一个脚本的 URI 来执行 worker 线程
const myWorker = new Worker("worker文件URL");

进阶 web worker hooks

// 创建一个Web Worker实例
const createWorker = (workerScript: Function) => {
    const blob = new Blob(["(" + workerScript.toString() + ")()"], { type: "text/javascript" });
    const url = window.URL.createObjectURL(blob);
    return new Worker(url);
};
function useWebWorker(workerScript: Function) {
    const worker = ref(createWorker(workerScript));
    const message = ref(null);
    const error = ref<ErrorEvent | null>(null);
    worker.value.onmessage = (e) => {
        message.value = e.data;
        error.value = null;
    };
    worker.value.onerror = (e) => {
        message.value = null;
        error.value = e;
    };
    const postMessage = (msg: string | object) => worker.value.postMessage(msg);
    onUnmounted(() => worker.value.terminate());
    return { postMessage, message, error };
}
export default useWebWorker;

进阶 web worker 引入、使用

import useWebWorker from '@/hooks/webWorker'
// 设定 web worker 接收数据函数
const workerScript = function() {
  self.onmessage = function(e) {
    console.log('Worker received:99 ' + e.data)
    self.postMessage('Worker received: ' + e.data); 
  };
};
// 获取 hooks 的数据
const { postMessage, message, error } = useWebWorker(workerScript);
postMessage(发送数据)

相关文章:

  • Qt中自定义插件和库(1)
  • 深入理解Docker Bridge网络模式:原理与实践指南
  • leetcode_203. 移除链表元素_java
  • 网络安全法规与入门指南
  • 【Android Studio】第一个Android程序 运行流程 程序调试 | 实操实战图文详细
  • net9.0 中System.Text.Json序列化和反序列化
  • spring-cloud-starter-dubbo使用说明
  • TypeScript:从类型工具到前端系统设计的跃迁
  • Python和MicroPython的解释器区别
  • 【算法学习计划】回溯 -- 综合题目(上)
  • 深入理解 Handler、Looper 、 MessageQueue和 HandlerThread
  • LINUX的使用(1)-挂载云硬盘
  • setInterval问题以及前端如何实现精确的倒计时
  • Error 1062 (23000): Duplicate entry ‘‘ for key ‘id‘`
  • Perl 发送邮件
  • 24统计建模国奖作品分享+写作框架提取3
  • Cursor 在前端需求开发工作流中的应用|得物技术
  • 根据日期格式化的常见规则和标准
  • 编程助手fitten code使用说明(超详细)(vscode)
  • spring mvc的拦截器HandlerInterceptor 接口详解
  • 我想看b站直播有哪些软件/百度指数在线查询
  • wordpress app登陆/昭通网站seo
  • 如何做优化网站排alexa优化/业务推广网站
  • 小网站建设公司/百度账号快速注册
  • 网站制作案例 立邦/智能网站排名优化
  • 电商网站开发分销商/宁波网站推广网站优化