web worker不能传递函数,怎么办?动态函数

需求

最近遇到一个需求,需要把用户自定义的函数(不用考虑执行函数的安全性)丢到worker中执行,但是postMessage时不能传递函数,所以要解决这个问题。

办法

解决办法:1、在postMessage时传递foo函数体字符串。2、在子线程接收后用new Function动态函数还原foo函数。

代码如下:

主线程:调用toString()拿到函数体的字符串,然后postMessage传递给子线程。

javascript 复制代码
function foo(a,b){
   console.log(a,b)
}
// 将函数转换为字符串
const fooString = foo.toString();

// 创建 Worker
const worker = new Worker('worker.js');

// 发送函数字符串和参数到 Worker
worker.postMessage({
  functionString: fooString
});

worker线程:拿到函数体字符串后通过new Function还原函数。

javascript 复制代码
self.onmessage = function(e) {
  const { functionString} = e.data;
  
  // 重新创建函数
  const foo = new Function(`return ${functionString}`)();
  
  // 在worker线程中执行函数
  foo.apply(null, [1,2]);
};

后续就可以直接调用这个函数了。

END

相关推荐
IT_陈寒1 分钟前
React开发者都在偷偷用的5个性能优化黑科技,你知道几个?
前端·人工智能·后端
hua8722216 分钟前
Golang 构建学习
java·开发语言·学习
2301_8035545216 分钟前
qt信号槽机制以及底层实现原理
开发语言·qt
大傻^17 分钟前
LangChain4j RAG 核心:Document、Embedding 与向量存储抽象
开发语言·人工智能·python·embedding·langchain4j
笨笨马甲17 分钟前
Qt 音视频编解码
开发语言·qt
Halo_tjn22 分钟前
Java 三个修饰符 相关知识点
java·开发语言
2401_8830354627 分钟前
C++20概念(Concepts)入门指南
开发语言·c++·算法
还是大剑师兰特31 分钟前
Vue3 前端专属配置(VSCode settings.json + .prettierrc)
前端·vscode·json
番茄去哪了34 分钟前
Java基础面试题day01
java·开发语言·后端·javase·八股·面向对象编程
wuqingshun31415939 分钟前
说说进程和线程的区别?
java·开发语言·jvm