能否将回调函数传递给Web Worker?

7
我有一个渲染工作器,我想要传递一个回调函数。我知道worker.postMessage方法现在支持JavaScript对象,但当我尝试传递一个对象内的函数时,会出现错误提示"无法克隆"该对象。
我还尝试对该对象使用JSON.stringify(),但发现函数不会被字符串化,因为JSON不支持函数作用域。
是否有一种方法可以将回调函数传递给Web Worker?如果没有,您会建议如何解决此限制?
我的问题是我向worker发送一个消息以同时开始渲染和动画。因此,在执行"回调"之前,我需要等待两者都完成。

你能展示一些代码吗?一个 [mcve] 会很好。 - Jamiec
我不确定您想要看哪些代码?我只需要知道是否有任何方法可以将函数传递给Web Worker。由于作用域的原因,JSON字符串无法使用,而传递对象文字会引发异常。您确切需要查看哪些代码? - Native Coder
1个回答

12
有没有一种方法可以将回调函数传递给 Web Worker?
来自 MDN
Worker 接口的 postMessage() 方法向 worker 的内部作用域发送消息。它接受一个参数,即要发送到 worker 的数据。该数据可以是任何值或由结构化克隆算法处理的JavaScript 对象,包括循环引用。
还有 also
不适用于结构化克隆的内容:
- 无法通过结构化克隆算法复制 Error 和 Function 对象;尝试这样做会抛出 DATA_CLONE_ERR 异常。
所以不行。你不能传递函数。
问题在于我向 worker 发送一个消息以便同时开始渲染和动画。因此我需要等待两者都完成后再执行“回调”函数。
生成一个唯一的ID(例如时间戳和随机数的拼接)。 存储它。 关联你喜欢的任何数据(包括你想用作回调的函数)。 将其传递给动画处理程序和Web Worker的最终处理程序。
当工作完成时,发送该ID返回。 监听包含该ID的事件,并在数据结构中查找它。

真是太有趣了,我在阅读你的回答之前刚刚完成了你建议的事情。非常感谢你提供的代码片段和链接,这让我对问题有了更清晰的认识。我之前已经阅读了 MDN 的第一个代码片段,但第二个代码片段让我更加明白了。 - Native Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接