Выбор ответа Middle Web API и воркеры обновлено

Как данные попадают в воркер через postMessage

Вопрос

Главный поток вызывает worker.postMessage(obj), где obj обычный объект с массивами. Затем меняет obj.list.push(1). Что увидит воркер?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Состояние объекта на момент postMessage: данные копируются structured clone. postMessage копирует данные алгоритмом structured clone в момент вызова, общей памяти у потоков нет.

Варианты ответа

  1. Изменение, потому что объект передаётся в воркер по ссылке на общую память
  2. Состояние объекта на момент postMessage: данные копируются structured cloneправильный ответ
  3. Ошибку: обычные объекты передавать нельзя, только строки через JSON.stringify
  4. Изменение, но только если воркер прочитает объект уже после push в главном потоке

Разбор

postMessage копирует данные алгоритмом structured clone в момент вызова, общей памяти у потоков нет. Поэтому последующий push воркер не увидит. Передача по ссылке невозможна между потоками. Строками ограничиваться не нужно: structured clone умеет объекты, массивы, Map, Set, Date, ArrayBuffer. Нельзя передать функции и DOM-узлы.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме