2009-09-09 4 views
0

En interne, Firefox JSON codera un objet transmis via postMessage vers et depuis Web Worker. Cependant, ceci ne fonctionne que dans les versions Trunk de Firefox (3.6+) et non dans Firefox 3.5, donc la question est vraiment de savoir comment ajouter un support arrière de cette opération à la plate-forme actuelle. Les méthodes window.atob() et window.btoa() ont déjà été suggérées, mais hélas, elles ne sont pas disponibles en interne pour les threads car elles n'ont pas accès au DOM. Mozilla publie ceci sur son wiki de développeur, mais de nombreux membres de la communauté ont remarqué que cela se produisait. Vérifiez le test du blog d'ejohn: http://ejohn.org/files/bugs/postMessage/Comment encoder un objet dans un Web Worker pour qu'il soit transmis via postMessage?

J'ai vérifié que c'est aussi le cas, en 3.5, il ne transmet que des chaînes, et 3.6 passera l'objet.

+0

Où est-il dit que cela ne fonctionne pas dans FF 3.5? Mozilla dit ici (https://developer.mozilla.org/En/Using_web_workers) que les exemples s'appliquent à FF 3.5 et qu'il encode le message en JSON en interne. D'ailleurs: pourquoi avez-vous besoin de vous soucier de la conversion interne, ce que vous obtenez lors de la réception du message est un objet JS, après tout, n'est-ce pas? – Fabian

+2

Message original mis à jour, vérifiez également ce billet de blog dans les commentaires. http://ejohn.org/blog/web-workers/ –

Répondre

2

Je n'ai pas remarqué que l'encodage JSON automatique ne fonctionne pas dans Firefox 3.5, mais j'ai surtout travaillé avec Gears, qui ne le supporte pas de toute façon.

Essayez d'inclure un JSON utility dans le script worker et le script parent, puis codez-le manuellement et décodez-le vous-même. Cela fonctionne assez bien pour moi avec Gears.

Cette approche ne doit pas être interrompue lorsque Firefox commence automatiquement à effectuer le codage JSON pour vous, car la chaîne JSON codée restera une chaîne.

+0

+1 bonne solution de contournement – Fabian

+2

J'ai essayé d'utiliser ce script mais, pour une raison quelconque, j'obtiens des erreurs lors de son utilisation en 3.5 et non en 3.6. Erreurs JSON.parse spécifiquement. –

+1

Pouvez-vous nous donner le message d'erreur exact que vous obtenez?Pouvez-vous nous montrer la chaîne exacte que vous passez dans JSON.parse? Cela aiderait à diagnostiquer le problème. –

0

Puisque vous êtes clairement à la recherche d'une solution FF uniquement, avez-vous essayé yourObject.toSource()?

+2

Par votre commentaire, j'ai essayé d'utiliser toSource et toString, mais ceux-ci ne semblaient pas aider. Je passe un objet JSON codé manuellement dans le worker et son décodé dans le thread principal. Cependant, toSource lorsqu'il est utilisé, un objet en ressort comme non défini dans le thread principal. –

0

J'ai trouvé la solution à mon propre problème!

Il semble que si la variable de thread, même si elle est déclarée globalement, perd sa propriété .onmessage si cette propriété a été déclarée dans une autre fonction. Si la propriété est instanciée sur la portée globale, les messages JSON sont analysés correctement. Je ne suis toujours pas sûr de comprendre ce qui se passe ici, mais au moins j'ai trouvé un moyen de passer des objets sans avoir à compter sur des bibliothèques stingify/json supplémentaires.

Si quelqu'un pouvait me l'expliquer, donc j'ai une meilleure compréhension, il serait apprécié :)

je configurer un cas de test ici: http://x.miernicki.com/ qui enregistre les messages inter-thread à la console Firebug si quelqu'un se soucie . Cela m'a aidé à faire circuler des objets dans Fox3.5 et m'a finalement permis de voir quel était le problème.

1

En JavaScript, il y a deux fonctions respectivement pour le décodage et l'encodage des chaînes base64:

atob() btoa()

Questions connexes