Не удалось выполнить '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 не сохраняется. Дескрипторы свойств, установщики и получатели (а также аналогичные метаданным функции) не дублируются. Например, если объект помечен только для чтения с использованием дескриптора свойства, он будет доступен для чтения и записи в дубликате, поскольку это условие по умолчанию. Цепочка прототипа не обходит и дублирует.

Другие вопросы по тегам