Как закодировать объект в веб-воркере, чтобы его можно было передать через postMessage?
-
05-07-2019 - |
Вопрос
Внутри Firefox будет кодировать JSON объект, передаваемый через postMessage в веб-воркер и обратно.Однако это работает только в сборках Trunk Firefox (3.6+), а не в Firefox 3.5, поэтому вопрос в том, как добавить обратную поддержку этой операции на текущую платформу.Методы window.atob() и window.btoa() предлагались ранее, но, увы, они недоступны внутри потоков, поскольку у них нет доступа к DOM.
Mozilla публично заявляет об этом на своей вики для разработчиков, но многие в сообществе заметили, что это происходит.Проверьте тест блога Эджона: http://ejohn.org/files/bugs/postMessage/
Я проверил, что это тоже так: в версии 3.5 он передает только строки, а в версии 3.6 — объект.
Решение
Я не заметил, что автоматическое JSON-кодирование не работает в Firefox 3.5, но я в основном работал с Gears, который все равно его не поддерживает.
Попробуйте включить утилиту JSON в обеих рабочих. сценарий и родительский сценарий, а затем вручную кодировать и декодировать его самостоятельно. Это хорошо работает для меня с Gears.
Этот подход не должен нарушаться, когда Firefox начинает автоматически выполнять кодировку JSON для вас, поскольку закодированная строка JSON останется строкой.
Другие советы
В JavaScript есть две функции соответственно для декодирования и кодирования строк base64:
atob () btoa ()
Я нашел решение своей проблемы!
Кажется, что если переменная потока, даже если она объявлена глобально, теряет свое свойство .onmessage, если это свойство было объявлено внутри другой функции.Если свойство создается в глобальной области, сообщения JSON анализируются правильно.
Я до сих пор не уверен, что понимаю, что здесь происходит, но, по крайней мере, я нашел способ передавать объекты без необходимости полагаться на какие-либо дополнительные библиотеки stingify/json.
Если бы кто-нибудь мог объяснить мне это, чтобы я лучше понял, я был бы признателен :)
Я настраиваю тестовый пример здесь: http://x.miernicki.com/ который записывает межпотоковые сообщения в консоль Firebug, если кому-то интересно.Это помогло мне передавать объекты в Fox3.5 и в конечном итоге позволило мне увидеть, в чем заключалась проблема.
Поскольку вы явно ищете решение только для FF, вы пробовали yourObject.toSource ()
?