【问题标题】:Is it possible to pass a callback to a webworker?是否可以将回调传递给网络工作者?
【发布时间】:2020-06-07 16:28:37
【问题描述】:

我有一个渲染工作者,我想将回调传递给它。我知道 worker.postMessage 方法现在支持 Javascript 对象,但是当我尝试使用对象传递函数时,我收到一个错误,告诉我它“无法克隆”对象。

我还在对象上尝试了 JSON.stringify(),并了解到函数不会被字符串化,因为 JSON 不支持函数范围。

有没有办法将回调传递给 Web Worker?如果不是,您建议如何解决这个限制?

我的问题是我在开始动画的同时向工作人员发送了一条消息以开始渲染。所以我需要等到两者都完成后再执行“回调”

【问题讨论】:

  • 你能显示一些代码吗? minimal reproducible example 会很好
  • 我不确定你想看什么代码?我只需要知道是否有任何方法可以将函数传递给网络工作者。由于作用域,JSON 字符串不起作用,传递对象文字会引发异常。您到底在寻找什么代码?

标签: javascript web-worker


【解决方案1】:

有没有办法将回调传递给 Web Worker?

来自MDN

Worker 接口的 postMessage() 方法向 Worker 的内部作用域发送消息。这接受一个参数,这是要发送给工作人员的数据。数据可以是任何值或 结构化克隆算法处理的 JavaScript 对象,包括循环引用。

还有also

结构化克隆不适用的东西

  • 错误和函数对象不能被结构化克隆算法复制;尝试这样做会引发 DATA_CLONE_ERR 异常。

所以。你不能传递关于的函数。

我的问题是我在开始动画的同时向工作人员发送了一条消息以开始渲染。所以我需要等到两者都完成后再执行“回调”

生成唯一 ID(例如,与随机数连接的时间戳)。存储它。关联您喜欢的任何数据(包括您想用作回调的函数)。将其传递给动画处理程序的末端和网络工作者。

工作完成后发回该 ID。侦听其中包含该 ID 的事件,并在您的数据结构中查找它。

【讨论】:

  • 有趣的是,在阅读您的答案之前,我刚刚完全按照您的建议完成了操作。非常感谢您提供的 sn-ps 和链接,这对我来说是正确的。我从 MDN 阅读了第一个 sn-p,但第二个是透视的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多