Поскольку вы подозревали, что объекты с функциями не могут быть опубликованы. То же самое касается объектов с рекурсивными ссылками, но в последнее время это изменилось в некоторых браузерах. Вместо того, чтобы рисковать делать ручную и дорогостоящую избыточную сериализацию для каждого сообщения, вы можете выполнить тест в начале вашего сценария, чтобы определить, какие функции использовать для отправки / получения данных.
У меня была та же проблема, и я решил ее, переместив почти весь код в рабочий и просто сохранив средство рендеринга (оборачивая 2d контекстный рендер) в основном потоке. На рабочем месте я сериализую различные вызовы отрисовки, предназначенные для холста, в виде чисел в (типизированном) массиве. Затем этот массив публикуется в главном потоке.
Так, например, когда я хочу нарисовать изображение, я вызываю метод drawImage()
на своем экземпляре визуализатора работника в работнике. Вызов переводится в нечто вроде [13,1,50,40]
, что соответствует enum метода draw, уникальному идентификатору изображения и его координатам xy. Несколько вызовов буферизуются и помещаются в один массив. В конце цикла обновления массив размещается в главном потоке. Принимающий экземпляр основного средства визуализации анализирует массив и выполняет соответствующие вызовы отрисовки.