5
Поскольку Web-Worker JSON сериализации данных между потоками, что-то вроде этого не работает:Как передать пользовательские экземпляры классов через Web-Workers?
worker.js
function Animal() {}
Animal.prototype.foobar = function() {}
self.onmessage = function(e) {
self.postMessage({animal: new Animal()})
}
main.js
let worker = new Worker('worker.js')
worker.onmessage = function(e) {
console.log(e.data)
}
worker.postMessage('go!')
Результат был бы простой объект с потерей прототипа foobar
.
Можно ли перенести пользовательский объект обратно в основную нить, не теряя при этом своих прототипов? Например, возможно ли это с ArrayBuffer
? Я не знаком с этим, поэтому я немного потерян.
Спасибо за ваш комментарий Эмилио. Хотя ваш скрипт не работает на 100%, я понимаю. Но не будет ли просто «новое животное» (JSON.parse (e.data)) делать то же самое? Нет необходимости в возрождении? Или ваше решение несколько быстрее? Моя основная цель - сохранить большую часть работы внутри рабочего, не блокируя основной поток. –
Да, не работает на 100% (я написал «на лету»). –
Если вы знаете, что вы всегда переносите Животное, вам не нужно все это stuf, вы можете просто передать тогда минимальные данные для его воссоздания. Но если вы можете передать что-либо любого типа, вы можете использовать этот подход. I.e .: 'var zoo = новый зоопарк ({jail1: новый Lion ('pepe', 12), jail2: новый Tigger ('winny', 5)}); worker.postMessage (зоопарк); ' –