Является ли манипулирование documentFragment в webWorker законным в принципе (многопоточность)?

1.main_thread и work_thread ничего не делят (ничего общего не делятся)

2. Построение domFragment на некотором уровне структуры (основанном на данных), все в main_thread занимает немного времени и может быть разделено на рабочие места для worker_thread.

Тем не менее, я могу теперь найти передать DocumentFragment в work_thread

postMessage(fragment) // no way

postMessage({f:fragment}) // no way ,same reason above(serialization)

postMessage(fragment,[fragment]) // no way, type checking , must be a buffer type...

может быть, такая оптимизация не стоит усилий? любые комментарии?

1 ответ

Решение

Как сказано в спецификации W3C, невозможно использовать API-интерфейс DOM из основного потока с рабочим потоком.

Выдержка из спецификации:

API-интерфейсы DOM (объекты Node, объекты Document и т. Д.) Недоступны для работников [...]

Поскольку DocumentFragment наследует, по крайней мере, от Node, отсылать его веб-работнику должно быть (почти) невозможно. Я сказал почти, потому что может быть возможно отправить его в виде строки (например, через innerHTML), но это означает, что вам придется каким-то образом анализировать его в рабочем потоке или собирать информацию из этой строки. Лично я не думаю, что есть какой-то умный способ сделать это.

Возможным решением может быть передача необработанных данных в виде JSON вашему рабочему потоку, создание строки и передача этой строки обратно.

Другие вопросы по тегам