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

相关推荐
rabbitlzx8 分钟前
《Async in C# 5.0》第十四章 深入探讨编译器对于async的转换
java·开发语言·c#·异步·asynchronous
神明不懂浪漫14 分钟前
【第十三章】操作符详解,预处理指令详解
c语言·开发语言·经验分享·笔记
万少15 分钟前
这可能是程序员离用AI赚钱最容易的一个机会了
前端·ai编程
MediaTea15 分钟前
Python:类型槽位
开发语言·python
范什么特西19 分钟前
狂神---死锁
java·前端·javascript
郝学胜-神的一滴22 分钟前
深入解析Effective Modern C++条款35:基于任务与基于线程编程的哲学与实践
开发语言·数据结构·c++·程序人生
weixin1997010801622 分钟前
易贝(eBay)商品详情页前端性能优化实战
前端·性能优化
小飞学编程...24 分钟前
【Java相关八股文(二)】
android·java·开发语言
用户6000718191024 分钟前
【翻译】Rolldown 工作原理解析:符号关联、CJS/ESM 模块解析与导出分析
前端
想睡好26 分钟前
标签的ref属性
前端·javascript·html