Не удалось выполнить postMessage для ServiceWorker: функция не может быть клонирована

1

Я пытаюсь отправить сообщение экземпляру сервисного работника. Я получаю следующую ошибку:

Не удалось выполнить '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
        });
    });
}

Любая идея, почему это происходит?

Теги:
service-worker

1 ответ

2

Фактически нашел ответ сразу, это в документах. В принципе вы не можете иметь свойство Function -type (которое, вероятно, есть где-то внутри объекта io()), потому что оно не может быть клонировано:

параметры
message Сообщение для отправки работнику службы. Это может быть любой структурированный клонируемый тип.

structured-clonable-type определяется как:

Структурированный алгоритм клонирования - это алгоритм, определяемый спецификацией HTML5 для копирования сложных объектов JavaScript. Он используется внутренне при передаче данных в Рабочие и из них через postMessage(). Он создает клон путем рекурсии через входной объект, сохраняя карту ранее посещенных ссылок, чтобы избежать бесконечных циклов перемещения.

Вещи, которые не работают со структурированным клоном

Объекты Error и Function не могут быть дублированы алгоритмом структурированного клона; попытка сделать это приведет к исключению DATA_CLONE_ERR. Попытка клонировать DOM-узлы также приведет к исключению DATA_CLONE_ERR. Некоторые параметры объектов не сохраняются: поле LastIndex объектов RegExp не сохраняется. Дескрипторы свойств, сеттеры и геттеры (а также похожие объекты, подобные метаданным) не дублируются. Например, если объект помечается только для чтения с использованием дескриптора свойства, он будет читать-писать в дубликате, поскольку это условие по умолчанию. Цепь прототипов не проходит и не дублируется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню