postMessageを介して渡されるオブジェクトをWeb Workerでどのようにエンコードしますか?
-
05-07-2019 - |
質問
内部的には、FirefoxはpostMessageを介してWeb Workerとやり取りするオブジェクトをJSONエンコードします。ただし、これはFirefoxのTrunkビルド(3.6以降)でのみ機能し、Firefox 3.5では機能しません。そのため、実際の問題は、この操作の後方サポートを現在のプラットフォームに追加する方法です。 window.atob()およびwindow.btoa()メソッドは以前に提案されていましたが、これらはDOMにアクセスできないため、スレッド内部では利用できません。
Mozillaはこれを開発者のwikiで公に述べていますが、コミュニティの多くの人がこれが起こっていることに気付きました。 ejohnのブログテストを確認します: http://ejohn.org/files/bugs/postMessage/
これも同様であることを確認しました。3.5では文字列のみを渡し、3.6ではオブジェクトを渡します。
解決
Firefox 3.5でJSONの自動エンコードが機能しないことに気づきませんでしたが、主にGearsで作業していましたが、とにかくそれをサポートしていません。
両方のワーカーに JSONユーティリティを含めてみてくださいスクリプトと親スクリプトを作成してから、自分で手動でエンコードおよびデコードします。 Gearsの場合、これはかなりうまく機能します。
Firefoxが自動的にJSONエンコーディングを実行し始めても、エンコードされたJSON文字列は文字列のままであるため、このアプローチは壊れません。
他のヒント
JavaScriptには、base64文字列をデコードおよびエンコードするための2つの関数があります。
atob() btoa()
自分の問題の解決策を見つけました!
スレッド変数がグローバルに宣言されていても、そのプロパティが別の関数内で宣言されている場合、その.onmessageプロパティを失うようです。プロパティがグローバルスコープでインスタンス化されている場合、JSONメッセージは正しく解析されます。
ここで何が起こっているのかまだわかりませんが、少なくとも、追加のstingify / jsonライブラリに依存せずにオブジェクトを渡す方法を見つけました。
誰かが私にこれを説明できるので、私がよりよく理解できるなら、それはありがたいです:)
ここでテストケースをセットアップします。 http://x.miernicki.com/ は、誰かが気にするなら、firebugコンソールへのスレッド間メッセージ。これにより、Fox3.5でオブジェクトを渡すことができ、最終的には問題の内容を確認できました。
明らかにFFのみのソリューションを探しているので、 yourObject.toSource()
を試しましたか?