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

封装一个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对象的URLconst 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)

如有问题,可提出,共勉

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

相关文章:

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

背景: 开启多线程处理一段耗时的逻辑 简化Worker使用 直接上代码: 以下是封装的函数直接复制即可 /*** 封装一个worker的启动函数 用于开启一个新的线程 来处理一些耗时的操作* param {object} paremdata 传递给worker的参数* param {function} call…...

unity3d————屏幕坐标,GUI坐标,世界坐标的基础注意点

在Unity3D中,GUI控件的起始坐标与屏幕坐标的起始点并不完全相同,具体说明如下: GUI控件的起始坐标 绘制GUI界面时使用的坐标以屏幕的左上角为(0,0)点,右下角为(Screen.width, Screen.Height)。不过,对于GUI控件的具体…...

MySQL基础-单表查询

语法 select [distinct] 列名1,列名2 as 别名... from数据表名 where组前筛选 group by分组字段 having组后筛选 order by排序的列 [asc | desc] limit 起始索引,数据条数 测试数据 # 建测试表 create table products (id int primary key a…...

Web安全之SQL注入---基础

文章目录 SQL注入简介SQL注入基础SQL注入分类SQL注入流程 SQL注入简介 什么是SQL注入? SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理…...

MongoDB笔记03-MongoDB索引

文章目录 一、前言1.1 概述1.2 MongoDB索引使用B-Tree还是BTree?1.3 B 树和 B 树的对比1.4 总结 二、索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引 三、索引的管理操作3.1 索引的查看3.2 索引的创建3.2.1 单字段索引3.2.2 复合索引 3.3 索引的移除3.3.1 指定索…...

Docker基础(一)

Docker 简介 常用命令 镜像 #搜索镜像 docker search nginx #下载镜像 docker pull nginx #下载指定版本镜像 docker pull nginx:1.26.0 #查看所有镜像 docker images #删除指定id的镜像 docker rmi e784f4560448 # 删除多个镜像 docker rmi bde7d154a67f 94543a6c1aef e784…...

解决 IntelliJ IDEA Maven 项目 JDK 版本自动变为 1.5 的问题

一、问题描述 在使用 IntelliJ IDEA 创建 Maven 项目时,经常会遇到一个问题:项目的默认编译版本被设置为 JDK 1.5,即使系统中安装的是更高版本的 JDK。这不仅会导致编译时出现警告,还可能引起兼容性问题。每次手动修改编译版本后…...

SDL事件相关

文章目录 事件相关的函数和数据结构用户自定义事件代码相关: 事件相关的函数和数据结构 SDL_WaitEvent :等待一个事件SDL_PushEvent 发送一个事件SDL_PumpEvents(): 将硬件设备产生的时间放入事件队列 ,用于读取事件,在调用该函数之前&#…...

探索App Intents:让你的应用与Siri无缝互动的新方式

苹果推出了一个新框架——App Intents,使开发者可以在iOS 18.2、macOS 15.2等平台上集成Siri和Apple Intelligence,实现对应用内容的读取和操作。 App Intents使应用的功能和内容能无缝融入系统体验中,例如Siri、Spotlight搜索、快捷指令和小…...

冒泡排序法

编写程序实现冒泡排序。 相关知识 为了完成本关任务,要了解冒泡法排序的算法思想: 对所有相邻记录的关键字值进行比较,如果是逆序则将其交换,最终达到有序化,其处理过程为: 将整个待排序的记录序列划分成…...

MATLAB 将fig格式另存为可编辑的eps格式,但乱码问题解决

fig格式图像正常,但通过手动导出后的eps格式图像导入到AI中会乱码,如下图所示 一、主要问题应该是: 文件名中的字符和格式受到了操作系统和文件系统的限制,具体而言是 figure 的Name 属性中包含了特殊字体或字符(如逗号&#xff…...

Hadoop:单节点配置YARN

目录 一、Hadoop YARN介绍 二、单节点配置YARN 2.1 配置yarn-site.xml 文件 2.2 配置 mapred-site.xml 文件 2.3 启动 Hadoop 和 YARN 2.4 浏览器访问 三、YARN的常用命令 3.1 启动和停止 YARN 3.2 查看和管理应用程序 3.3 查看和管理节点 3.4 查看和管理队列 3.5 …...

【前端】Svelte:组件间通信

在 Svelte 中,组件间的通信主要通过 props 和事件机制来实现。父组件可以向子组件传递数据,子组件也可以通过事件将信息反馈给父组件。在本教程中,我们将深入了解 Svelte 的组件通信机制,包括 props 和事件的使用方法、事件监听、…...

数学建模-----假设性检验引入+三个经典应用场景(三种不同的假设性检验类型)

文章目录 1.假设检验的过程1.1问题的提出1.2证据的引入1.4做出结论 2.案例二:汽车引擎排放2.1进行假设2.2假设检验的类型2.3抽样分布的类型2.4单尾(双尾)检验2.5t检验 3.案例三:特鲁普效应3.1统计显著和效果显著3.2心理学现象3.3进…...

Unity——对RectTransform进行操作

文章目录 前言在Unity中对RectTransform进行操作是处理UI布局和动画的关键部分。下面是一些常见的操作及其代码示例,可以帮助你在脚本中灵活地控制UI元素的位置、大小和锚点。 一、获取和设置位置二、获取和设置大小1.设置大小(Size Delta) 三…...

使用jmeter查询项目数据库信息,保存至本地txt或excel文件1108

知识点1:使用jmeter把项目数据库的数据导出,并使用jmeter导出数据库的数据 步骤1:使用jmeter把项目数据库的数据导出 (1)测试计划-添加- 线程组setUp线程组 setUp线程组:添加-配置元件-JDBC Connection …...

ubuntu 22.04 server 安装 mysql 5.7.40 更改 datadir 目录 LTS

ubuntu 22.04 server 安装 mysql 5.7.40 更改 datadir 目录 LTS 参考 ubuntu 22.04 server 安装 mysql 5.7.40 LTS https://blog.csdn.net/wowocpp/article/details/143564015 vip Ubuntu中修改MySQL5.7数据存储路径 https://www.cnblogs.com/jiaojiner/p/15236639.html u…...

网站架构知识之Ansible进阶2(day023)

1.include文件 应用场景: 1个ansible剧本内容过多,涉及到多个play(- host:web),可读性变弱,不方便调试。 于是人们想出把单个大的剧本拆分为多个小的剧本, 多个小的剧本可以通过include功能合并使用。 使用方法,书写好对应的剧本文件&#…...

Java 中的 Function:让转换逻辑更灵活

文章目录 1. Function 基础:简化转换逻辑2. 组合 Function:实现多步转换3. 配合 Stream 使用:简化数据转换4. 自定义 Function,封装复杂转换5. 使用 identity() 提供默认转换6. 结合 Optional,实现动态数据转换7. 用于…...

10. java基础知识(下)

文章目录 一、一带而过二、字符串类型String1. 简单了解2. 关于结束符\03. 自动类型转换与强制类型转换 三、API文档与import导包1. API文档2. import导包 四、java中的数组1. 创建2. 遍历3. 补充4. Arrays类① 简单介绍② 练习 五、方法的重载六、规范约束七、内容出处 一、一…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...

react更新页面数据,操作页面,双向数据绑定

// 路由不是组件的直接跳转use client&#xff0c;useEffect&#xff0c;useRouter&#xff0c;需3个结合&#xff0c; use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...

Python爬虫(四):PyQuery 框架

PyQuery 框架详解与对比 BeautifulSoup 第一部分&#xff1a;PyQuery 框架介绍 1. PyQuery 是什么&#xff1f; PyQuery 是一个 Python 的 HTML/XML 解析库&#xff0c;它采用了 jQuery 的语法风格&#xff0c;让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...