Как данные попадают в воркер через postMessage
Вопрос
Главный поток вызывает worker.postMessage(obj), где obj обычный объект с массивами. Затем меняет obj.list.push(1). Что увидит воркер?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Изменение, потому что объект передаётся в воркер по ссылке на общую память
- Состояние объекта на момент
postMessage: данные копируются structured cloneправильный ответ - Ошибку: обычные объекты передавать нельзя, только строки через
JSON.stringify - Изменение, но только если воркер прочитает объект уже после
pushв главном потоке
Разбор
postMessage копирует данные алгоритмом structured clone в момент вызова, общей памяти у потоков нет. Поэтому последующий push воркер не увидит. Передача по ссылке невозможна между потоками. Строками ограничиваться не нужно: structured clone умеет объекты, массивы, Map, Set, Date, ArrayBuffer. Нельзя передать функции и DOM-узлы.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Чем делать бесконечную ленту
Следующий вопрос
requestAnimationFrame против setInterval