【问题标题】:What interface do I need to implement to allow object to be passed through WebWorker's postMessage?我需要实现什么接口才能允许对象通过 WebWorker 的 postMessage 传递?
【发布时间】:2015-12-27 13:30:00
【问题描述】:

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

【问题讨论】:

    标签: javascript interface web-worker


    【解决方案1】:

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

    我是这样知道的:

    规范中负责 web worker 的 postMessage 的部分(顺便说一下,与 window 的 postMessage 相同)可以在这里找到:https://html.spec.whatwg.org/multipage/comms.html#dom-messageport-postmessage

    这是很多无趣的技术内容,但重要的部分是:

    message clone 成为获得 message 参数的结构化克隆的结果,[...]

    结构化克隆算法在这里:https://html.spec.whatwg.org/multipage/infrastructure.html#structured-clone

    如您所见,情况看起来相当严峻。它检查内置对象和值(如 Number 或 Blob),并相应地构造它们。您可以传递任意对象,但只会保留它们的结构。


    那么,你能做什么呢?

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

    【讨论】:

    • 感谢您的回答。我肯定会给你+1,但我会在接受之前花点时间,以防有人会提出更多关于解决方法的想法。事实证明,出于性能原因,我当前的项目将只发送少量数字和字符串,并在两侧创建所有伪类实例。在另一个项目中,我可能会创建自己的序列化层。
    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2020-01-16
    • 2017-11-23
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多