我正在尝试将消息发布到服务工作者实例。我收到以下错误:
无法执行' 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
});
});
}
知道为什么会这样吗?
答案 0 :(得分:3)
实际上立即找到了答案,它在文档中。您基本上不能拥有Function
- 类型的属性(可能在io()对象中的某处),因为它无法克隆:
参数
message
要发送给服务工作者的消息。这可以是任何 结构化克隆型。
structured-clonable-type
被定义为:
结构化克隆算法是HTML5定义的算法 复制JavaScript对象的规范。它被使用了 内部通过工作人员传输数据 的postMessage()。它通过递归输入构建克隆 对象,同时维护以前访问过的引用的映射 为了避免无限次遍历循环。
不适用于结构化克隆的内容
结构化克隆算法无法复制错误和功能对象;试图这样做会抛出一个 DATA_CLONE_ERR 例外。同样,尝试克隆DOM节点也是如此 抛出 DATA_CLONE_ERR 异常。对象的某些参数是 未保留:不保留RegExp对象的lastIndex字段。 属性描述符,setter和getter(以及类似的 类似元数据的功能)不重复。例如,如果是对象 使用属性描述符标记为只读,它将是读写 在副本中,因为那是默认条件。原型 链不会走路和重复。