能否构建可执行任意JavaScript函数并封装为Promise的WebWorker抽象层?
基于Web Worker封装Promise化任意函数执行层的问题
我希望在Web Worker API之上构建一层抽象层,实现以下两个核心目标:
- 在Web Worker中执行任意函数
- 将交互过程封装为Promise
期望的使用效果大致如下:
function bake() { ... // 耗时计算逻辑 return 'mmmm, pizza' } async function handlePizzaButtonClick() { const pizza = await workIt(bake) eat(pizza) }
(显然,给函数添加参数的扩展逻辑难度不大。)
我初步实现的workIt函数如下:
async function workIt<T>(f: () => T): Promise<T> { const worker: Worker = new Worker('./unicorn.js') // 暂未创建该worker文件 worker.postMessage(f) return new Promise<T>((resolve, reject) => { worker.onmessage = ({data}: MessageEvent) => resolve(data) worker.onerror = ({error}: ErrorEvent) => reject(error) }) }
这个实现失败的核心原因是:函数不具备结构化克隆特性,因此无法通过Web Worker的消息机制传递。(Promise封装的部分逻辑是正常的。)
目前存在多种JavaScript函数序列化方案,但部分方案存在较高风险。不过在采用这类方案之前,我想确认:是否还有其他遗漏的方法?有没有其他方式可以利用Web Worker(或其他多线程执行环境)来运行任意JavaScript代码?
内容的提问来源于stack exchange,提问作者Sasgorilla
相关产品推荐
相关产品推荐

