Javascript 如何在Web Worker中对对象进行编码,以便通过postMessage传递该对象?

Javascript 如何在Web Worker中对对象进行编码,以便通过postMessage传递该对象?,javascript,json,multithreading,postmessage,web-worker,Javascript,Json,Multithreading,Postmessage,Web Worker,在内部,Firefox将JSON编码通过postMessage传递给Web工作者的对象。然而,这只适用于Firefox(3.6+)的主干版本,而不适用于Firefox 3.5,因此问题是如何在当前平台上添加此操作的向后支持。window.atob()和window.btoa()方法之前已经提出过,但遗憾的是,这些方法在线程内部不可用,因为它们没有访问DOM的权限 Mozilla在其开发者wiki上公开声明了这一点,但社区中的许多人都注意到了这一点。查看ejohn的博客测试: 我已经验证了这种情况

在内部,Firefox将JSON编码通过postMessage传递给Web工作者的对象。然而,这只适用于Firefox(3.6+)的主干版本,而不适用于Firefox 3.5,因此问题是如何在当前平台上添加此操作的向后支持。window.atob()和window.btoa()方法之前已经提出过,但遗憾的是,这些方法在线程内部不可用,因为它们没有访问DOM的权限

Mozilla在其开发者wiki上公开声明了这一点,但社区中的许多人都注意到了这一点。查看ejohn的博客测试:


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

我没有注意到自动JSON编码在Firefox 3.5中不起作用,但我主要使用Gears,它无论如何都不支持它

尝试在工作者脚本和父脚本中都包含一个,然后自己手动编码和解码它。这对我来说是相当好的齿轮


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

我没有注意到自动JSON编码在Firefox 3.5中不起作用,但我主要使用Gears,Gears无论如何都不支持它

尝试在工作者脚本和父脚本中都包含一个,然后自己手动编码和解码它。这对我来说是相当好的齿轮


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

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

,因为您显然在寻找仅限FF的解决方案,你试过你的Object.toSource()吗?

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

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

我仍然不确定我是否理解这里发生的事情,但至少我已经找到了一种方法来传递对象,而不必依赖任何额外的stingify/json库

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


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

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

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

我仍然不确定我是否理解这里发生的事情,但至少我已经找到了一种方法来传递对象,而不必依赖任何额外的stingify/json库

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


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

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

atob()
btoa()

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

atob()
btoa()

在FF 3.5中,哪里说明它不起作用?Mozilla在这里()说,这些示例适用于FF3.5,并且它在内部将消息编码为JSON。另外:为什么你需要关心内部转换,你收到消息时得到的毕竟是一个JS对象,不是吗?原始帖子更新了,也可以在评论中查看这篇博客帖子。在FF 3.5中,哪里说明它不起作用?Mozilla在这里()说,这些示例适用于FF3.5,并且它在内部将消息编码为JSON。另外:为什么你需要关心内部转换,你收到消息时得到的毕竟是一个JS对象,不是吗?原始帖子更新了,也可以在评论中查看这篇博客帖子。我尝试过使用这个脚本,但由于某些原因,我在3.5而不是3.6中使用它时出错。具体是JSON.parse错误。您能告诉我们您收到的确切错误消息吗?您能告诉我们您正在传递到JSON.parse的确切字符串吗?这将有助于诊断问题。我尝试使用此脚本,但由于某些原因,我在3.5而不是3.6中使用它时出错。具体是JSON.parse错误。您能告诉我们您收到的确切错误消息吗?您能告诉我们您正在传递到JSON.parse的确切字符串吗?这将有助于诊断问题。根据您的评论,我尝试使用toSource和toString,但这些似乎没有帮助。我在worker中传递一个手工编码的JSON对象,并在主线程中对其进行解码。但是,当使用对象时,toSource在主线程中显示为未定义。根据您的评论,我尝试使用toSource和toString,但这些似乎没有帮助。我在worker中传递一个手工编码的JSON对象,并在主线程中对其进行解码。但是,当使用对象时,toSource在主线程中显示为未定义。