Не работает отправка JSON в Worker через Transferable Objects

117
11 ноября 2019, 22:50

Использую Worker для слияния двух крупных JS-объектов, но почему-то пересылка данных туда-обратно занимает чуть ли не по 2 секунды (так, как было до внедрения воркеров). Прочитал, что можно использовать Transferable Object. Якобы невероятно ускоряет скорость передачи данных в Worker и обрватно.

В посте Google Developers сказано:

This allowed the postMessage() API to accept messages that were not just strings, but complex types like File, Blob, ArrayBuffer, and JSON objects

Ну вот я и передаю JS-объект:

var workerData = {
    task: 'merge',
    data: {
        new: iterationData,
        original: {
            airlines: window.airlines,
            airports: window.airports,
            filters: window.filters,
            flight_info: window.flight_info,
            gates_info: window.gates_info,
            proposal_seats: window.proposal_seats,
            proposals: window.proposals,
            filteredProposals: window.filteredProposals,
            rules: window.rules
        }
    }
}
merge_worker.postMessage(workerData, [workerData])

И лювлю в консоли предупреждение:

Value at index 0 does not have a transferable type

Почему мой код не работает?

Answer 1

Как написано в документации, Transferable Object должен быть следующих типов ArrayBuffer, MessagePort или ImageBitmap.

Переданные (transferable) объекты могут быть экземплярами классов ArrayBuffer, MessagePort или ImageBitmap. null не является допустимым значением для передачи прав.

Соответственно, вы не можете передать туда просто JS-объект.

Возможно, можно попробовать сериализовать ваш объект в ArrayBuffer, но не думаю, что это будет быстрее, чем слияние JS-объект.

READ ALSO
Почему Ajax после загрузки данных из бд не работает

Почему Ajax после загрузки данных из бд не работает

У меня есть код страницы для выбора теста :

117
Есть способ получше (Fixed blur-effect container)?

Есть способ получше (Fixed blur-effect container)?

Я нашел способ создать фиксированный контейнер с blur-эффектом, как оказалось способ простой, но достаточно страшныйЧто будет с индексацией...

118
Сравнение массивов в js

Сравнение массивов в js

Вернет true, почему?

96
Почему может не срабатывать JQuery

Почему может не срабатывать JQuery

почему не срабатывает у меня Jquery? Вот есть функция

113