【问题标题】:Passing a Javascript-Object to Web Worker将 Javascript 对象传递给 Web Worker
【发布时间】:2013-03-12 12:09:28
【问题描述】:

我有一个这样的对象:

function A(id) {
    this.id = id;
}

A.prototype.getId = function() {
    return this.id;
}

它作为文件(“objects.js”)包含在 html 页面中,也包含在带有 importScript(“objects.js”)的 web worker 中。 现在我使用“var a = new A()”在 html 页面中创建 A 的实例,并使用“postMessage()”将其发布到 Web Worker。

有趣的是,在 worker 中它仍然具有属性“id”及其值,但原型函数丢失了。 我猜原因可能是原型函数被“绑定”到 html-page 上下文而不是 web worker 上下文。

所以我在工人中所做的是:

event.data.a.__proto__ = A.prototype;

它正在工作,我认为它是某种演员......

现在我的问题是,这是否是唯一且有效的方法,或者是否有更好的方法将具有原型功能的对象发布给网络工作者。 对象定义在两种上下文中都可用...

【问题讨论】:

    标签: javascript web-worker postmessage


    【解决方案1】:

    structure clone algorithm 用于在将数据发送给 web worker 之前对其进行序列化,它不会遍历原型链(有关详细信息,请参阅§ 2.7.5 Safe passing of structured data)。这就解释了为什么不保留派生函数。

    除了手动恢复对象外,还可以创建一个新对象,它具有原型函数,并使用Object.assign从接收到的对象中复制属性。

    请注意,这两种变通方法都假定原型对象及其功能为网络工作者所知。一般来说,在保留函数的同时没有自动传输任意对象的方法(请参阅我的 answerthis related question 关于发送带有函数的对象)。

    【讨论】:

      【解决方案2】:

      webworkers 规范不允许传递字符串以外的任何内容。

      Here 是关于这个的问题。

      因此,您应该使用(例如)json 序列化对象数据,然后在另一端对其进行反序列化,从而在 webworker 中创建具有相同数据的对象的新实例。

      可以使用相同的方法再次将对象传回 - 但他们都必须知道如何创建、序列化和反序列化 A 类型的对象。

      【讨论】:

      • 我很确定它也可以传递一个对象,只要它没有函数。至少它在所有主要浏览器中都适用于我......
      • @user2160787 是的,但这只是因为 Javascript 会自动序列化和反序列化简单对象(例如数组)。
      • 好的,谢谢,所以我想我只是拒绝原型函数:)
      猜你喜欢
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2011-12-07
      • 2017-07-21
      • 2012-07-30
      • 1970-01-01
      相关资源
      最近更新 更多