【问题标题】:Failed to execute 'postMessage' on 'ServiceWorker': function could not be cloned无法在“ServiceWorker”上执行“postMessage”:无法克隆函数
【发布时间】:2017-09-11 04:55:25
【问题描述】:

我正在尝试向服务人员实例发布消息。我收到以下错误:

在“ServiceWorker”上执行“postMessage”失败:函数(){ 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
        });
    });
}

知道为什么会这样吗?

【问题讨论】:

    标签: javascript service-worker


    【解决方案1】:

    实际上马上就找到了答案,它在文档中。你基本上不能有 Function-type 属性(它可能在 io() 对象的某个地方),因为它不能被克隆:

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

    structured-clonable-type 被定义为:

    结构化克隆算法是HTML5定义的算法 用于复制复杂 JavaScript 对象的规范。它被使用 在内部与工人之间传输数据时通过 发布消息()。它通过输入递归来构建一个克隆 对象,同时维护以前访问过的引用的映射 为了避免无限循环。

    不能使用结构化克隆的东西

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

    【讨论】:

    • 嗨,你如何实现服务工作者的实例化套接字,我尝试这样做并遇到与上述相同的问题。
    猜你喜欢
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2019-11-05
    相关资源
    最近更新 更多