Я пытаюсь отправить сообщение экземпляру сервисного работника. Я получаю следующую ошибку:
Не удалось выполнить 'postMessage' в 'ServiceWorker': function() {obj.removeListener(ev, fn); } could not be cloned. } не может быть клонирован.
Мой код выглядит следующим образом:
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
});
});
}
Любая идея, почему это происходит?
Фактически нашел ответ сразу, это в документах. В принципе вы не можете иметь свойство Function
-type (которое, вероятно, есть где-то внутри объекта io()), потому что оно не может быть клонировано:
параметры
message
Сообщение для отправки работнику службы. Это может быть любой структурированный клонируемый тип.
structured-clonable-type
определяется как:
Структурированный алгоритм клонирования - это алгоритм, определяемый спецификацией HTML5 для копирования сложных объектов JavaScript. Он используется внутренне при передаче данных в Рабочие и из них через postMessage(). Он создает клон путем рекурсии через входной объект, сохраняя карту ранее посещенных ссылок, чтобы избежать бесконечных циклов перемещения.
Вещи, которые не работают со структурированным клоном
Объекты Error и Function не могут быть дублированы алгоритмом структурированного клона; попытка сделать это приведет к исключению DATA_CLONE_ERR. Попытка клонировать DOM-узлы также приведет к исключению DATA_CLONE_ERR. Некоторые параметры объектов не сохраняются: поле LastIndex объектов RegExp не сохраняется. Дескрипторы свойств, сеттеры и геттеры (а также похожие объекты, подобные метаданным) не дублируются. Например, если объект помечается только для чтения с использованием дескриптора свойства, он будет читать-писать в дубликате, поскольку это условие по умолчанию. Цепь прототипов не проходит и не дублируется.