我需要实现什么接口才能允许对象通过WebWorker的postMessage传递?

时间:2015-09-29 22:11:26

标签: javascript interface web-worker

javascript中的

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),则必须失败在新范围内定义。

1 个答案:

答案 0 :(得分:2)

唉,你不能。您不能指定自己的序列化器/反序列化器(或marshaller / unmarshaller)。您可以保留对象结构,这在大多数情况下足够好,但构造函数和函数之类的信息不会通过。

以下是我对此的了解:

可以在此处找到负责网络工作者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),并相应地构造它们。您可以传递任意对象,但只保留其结构。

那么,你能做什么?

  1. 接受它。只有数据才能通过,就像JSON一样,只有更多限制。实际上并没有那么糟糕,并鼓励分离传输层和实现。
  2. 实现自己的marshaller / unmarshaller,包装postMessage等。实际上并不是那么困难,而且可以是一个很好的练习。
  3. 痛苦的泪水。我喜欢这个选项,它有助于处理日常生活。