2009-09-09 87 views
0

在内部,Firefox将JSON编码通过postMessage传入和传出Web Worker的对象。但是,这只适用于火狐(3.6+)的Trunk版本,而不适用于Firefox 3.5,所以问题在于如何将此操作的后向支持添加到当前平台。 window.atob()和window.btoa()方法之前已经被提出过,但是这些对于线程来说是内部不可用的,因为它们无法访问DOM。如何在Web Worker中对Object进行编码以使其通过postMessage传递?

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

我已经验证,这是这种情况,以及在3.5,它只传递字符串,并在3.6是传递对象。

+0

凡被它说,它不工作,在FF 3.5? Mozilla在这里说(https://developer.mozilla.org/En/Using_web_workers)这些例子适用于FF 3.5,并且它在内部将消息编码为JSON。另外:为什么你需要关心内部转换,接收到消息的时候得到的是一个JS对象,毕竟不是吗? – Fabian 2009-09-09 21:48:22

+2

原始帖子已更新,也请在评论中查看此博文。 http://ejohn.org/blog/web-workers/ – 2009-09-09 23:01:21

回答

2

我还没有注意到自动JSON编码在Firefox 3.5中不起作用,但我主要使用了Gears,它不支持它。

尝试在工作脚本和父脚本中包含JSON utility,然后自己手动对其进行编码和解码。 Gears对我来说效果相当好。

当Firefox开始自动为您执行JSON编码时,此方法不应中断,因为编码的JSON字符串将保持为字符串。

+0

+1良好的解决方法 – Fabian 2009-09-09 21:52:55

+2

我试过使用这个脚本,但由于某种原因,我在3.5和3.6版本中使用时遇到错误。 特别是JSON.parse错误。 – 2009-09-09 23:26:31

+1

你能给我们提供你正确的错误信息吗?你能告诉我们你传入JSON.parse的确切字符串吗?这将有助于诊断问题。 – 2009-09-10 00:20:55

0

由于您明确寻找FF-only解决方案,您是否试过yourObject.toSource()

+2

根据您的评论,我尝试使用toSource和toString,但这些似乎没有帮助。我在worker中传递一个手工编码的JSON对象,并在主线程中解码它。但是,使用对象时的toSource在主线程中未定义。 – 2009-09-09 23:28:28

0

我发现了解决我自己的问题!

看来,如果线程变量,即使全局声明,如果该属性是在另一个函数内声明的,它将丢失它的.onmessage属性。如果该属性在全局范围上实例化,则JSON消息将被正确解析。

我还不确定我是否理解这里发生了什么,但至少我已经想出了一种传递对象的方法,而不必依赖任何额外的stingify/json库。

如果有人可以解释这对我,让我有更好的了解,我们将不胜感激:)

我建立一个测试案例在这里:http://x.miernicki.com/它记录线程间消息Firebug控制台如果有人问津。这帮助我在Fox3.5中传播物体,并最终让我看到问题所在。

1

在JavaScript中有分别与编码和解码的base64字符串两个功能:

ATOB() BTOA()

相关问题