无法执行' postMessage' on' ServiceWorker':无法克隆功能

时间:2017-09-10 20:44:24

标签: javascript service-worker

我正在尝试将消息发布到服务工作者实例。我收到以下错误:

  

无法执行' postMessage' on' 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 个答案:

答案 0 :(得分:3)

实际上立即找到了答案,它在文档中。您基本上不能拥有Function - 类型的属性(可能在io()对象中的某处),因为它无法克隆:

  

参数
message    要发送给服务工作者的消息。这可以是任何   结构化克隆型

structured-clonable-type被定义为:

  

结构化克隆算法是HTML5定义的算法   复制JavaScript对象的规范。它被使用了   内部通过工作人员传输数据   的postMessage()。它通过递归输入构建克隆   对象,同时维护以前访问过的引用的映射   为了避免无限次遍历循环。

     

不适用于结构化克隆的内容

     结构化克隆算法无法复制

错误功能对象;试图这样做会抛出一个    DATA_CLONE_ERR 例外。同样,尝试克隆DOM节点也是如此   抛出 DATA_CLONE_ERR 异常。对象的某些参数是   未保留:不保留RegExp对象的lastIndex字段。   属性描述符,setter和getter(以及类似的   类似元数据的功能)不重复。例如,如果是对象   使用属性描述符标记为只读,它将是读写   在副本中,因为那是默认条件。原型   链不会走路和重复。