繁体   English   中英

如何在Web Worker中编码对象以使其通过postMessage传递?

[英]How do you encode an Object in a Web Worker for it to be passed via postMessage?

在内部,Firefox将对通过postMessage传递给Web Worker和从Web Worker传递的对象进行JSON编码。 但是,这仅在Firefox(3.6+)的Trunk版本中起作用,而在Firefox 3.5中不起作用,因此问题实际上是如何向当前平台添加对此操作的向后支持。 之前曾建议过window.atob()和window.btoa()方法,但是由于这些线程无法访问DOM,因此它们在线程内部不可用。

Mozilla在其开发者Wiki上公开声明了这一点,但是社区中的许多人已经注意到这种情况的发生。 检查ejohn的博客测试: http ://ejohn.org/files/bugs/postMessage/

我已经验证了这种情况,在3.5中,它仅传递字符串,而在3.6中将传递对象。

我没有注意到自动JSON编码在Firefox 3.5中不起作用,但是我主要是在Gears上工作,而Gears仍然不支持它。

尝试在辅助脚本和父脚本中都包含JSON实用程序 ,然后自己手动对其进行编码和解码。 Gears对我来说效果很好。

当Firefox开始自动为您执行JSON编码时,这种方法应该不会中断,因为编码后的JSON字符串将仍然是字符串。

在JavaScript中,有两个函数分别用于解码和编码base64字符串:

atob()btoa()

由于您显然正在寻找仅使用FF的解决方案,因此您是否尝试过yourObject.toSource()

我找到了解决自己问题的方法!

如果线程变量即使在全局范围内声明,也可能会丢失其.onmessage属性(如果该属性是在另一个函数中声明的)。 如果在全局范围内实例化该属性,则可以正确解析JSON消息。

我仍然不确定我了解这里发生了什么,但是至少我已经找到了一种无需依赖任何其他stingify / json库即可传递对象的方法。

如果有人可以向我解释这一点,以便我有更好的理解,将不胜感激:)

我在这里设置了一个测试用例: http : //x.miernicki.com/ ,如果有人关心,它将线程间消息记录到Firebug控制台。 这帮助我在Fox3.5中传递了对象,并最终使我了解了问题所在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM