Не удалось выполнить 'postMessage' на 'ServiceWorker': не удалось клонировать функцию
Я пытаюсь отправить сообщение экземпляру сервисного работника. Я получаю следующую ошибку:
Не удалось выполнить postMessage для ServiceWorker: function (){ obj.removeListener(ev, fn); } не может быть клонирован.
Мой код выглядит следующим образом:
var socket = io();
function onYouTubeIframeAPIReady() {
//Tell the service worker who I am
navigator.serviceWorker.ready.then(serviceWorkerRegistration => {
navigator.serviceWorker.controller.postMessage({
name: 'socketInit',
value: socket
});
});
}
Есть идеи, почему это происходит?
1 ответ
На самом деле нашел ответ сразу, это в документах. Вы в принципе не можете иметь Function
свойство -type (которое, вероятно, находится где-то внутри объекта io()), потому что его нельзя клонировать:
параметры
message
Сообщение для отправки сервисному работнику. Это может быть любой структурно-клонируемый тип.
structured-clonable-type
определяется как:
Алгоритм структурированного клонирования - это алгоритм, определенный в спецификации HTML5 для копирования сложных объектов JavaScript. Он используется внутри системы при передаче данных в Workers и обратно через postMessage(). Он создает клон путем повторения через входной объект, сохраняя карту ранее посещенных ссылок, чтобы избежать бесконечного обхода циклов.
Вещи, которые не работают со структурированным клоном
Объекты Error и Function не могут дублироваться алгоритмом структурированного клонирования; попытка сделать это вызовет исключение DATA_CLONE_ERR. Попытка клонировать DOM-узлы также вызовет исключение DATA_CLONE_ERR. Некоторые параметры объектов не сохраняются: поле lastIndex объектов RegExp не сохраняется. Дескрипторы свойств, установщики и получатели (а также аналогичные метаданным функции) не дублируются. Например, если объект помечен только для чтения с использованием дескриптора свойства, он будет доступен для чтения и записи в дубликате, поскольку это условие по умолчанию. Цепочка прототипа не обходит и дублирует.