WebWorkers API允许您使用浏览器中的worker.postMessage
和Worker中的postMessage
在工作线程和主线程之间传递对象。
我一直在玩,不仅是postMessage
传递的数组和对象,甚至是RegExp实例,所以我假设这些对象实现了一些接口。例如,对于字符串转换,您实现.toString
方法:
"" + {toString: function() {return "Hello world!"}}; //prints `Hello world!`
同样,您可以实施toJSON
方法:
JSON.stringify({toJSON: alert});
//Throws `TypeError: 'alert' called on an object that does not implement interface Window.`
// - demonstrating that toJSON is being called
我的问题是,我应该为postMessage
实施什么才能让我的Player
课程通过沟通渠道:
function Player(name) {
this.name = name;
}
Player.prototype = Object.create(EventEmitter2.prototype);
我故意在这里添加了继承部分 - 我需要对象保留某些东西的实例,而不仅仅是数据持有者。就像RegExp
一样,我需要通过我定义的方法或方法重建 - 如果需要上下文(类型定义,例如EventEmitter2
),则必须失败在新范围内定义。
答案 0 :(得分:2)
以下是我对此的了解:
可以在此处找到负责网络工作者postMessage
(与窗口的postMessage
相同)的规范部分:https://html.spec.whatwg.org/multipage/comms.html#dom-messageport-postmessage
这是很多无趣的技术内容,但重要的是这个:
让消息克隆成为获取消息参数的结构化克隆的结果,[...]
结构化克隆算法位于:https://html.spec.whatwg.org/multipage/infrastructure.html#structured-clone
正如你所看到的,事情看起来非常严峻。它检查内置对象和值(如Number或Blob),并相应地构造它们。您可以传递任意对象,但只保留其结构。
那么,你能做什么?
postMessage
等。实际上并不是那么困难,而且可以是一个很好的练习。