javascript - 将 Javascript 对象传递给 Web Worker

标签 javascript web-worker postmessage

我有一个这样的对象:

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

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

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

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

所以我在 worker 中做的是:

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

它正在工作,我将其视为某种 Actor ...

现在我的问题是,这是否是唯一有效的方式,或者是否有更好的方式将具有原型(prototype)函数的对象发布给网络 worker 。 对象定义在两种上下文中都可用...

最佳答案

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

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

请注意,这两种变通方法都假定原型(prototype)对象及其函数为 web worker 所知。一般而言,没有在保留函数的同时传输任意对象的自动方法(请参阅我的 answerthis related question 关于发送带有函数的对象)。

关于javascript - 将 Javascript 对象传递给 Web Worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15360810/

相关文章:

Javascript 测试 - 使用 axios 验证授权 header 是否正确

Meteor:使用 Web Worker

html - 停止监听 postMessage 消息事件

c++ - PostMessage() 成功但我的消息处理代码从未收到消息

javascript - 怎么了?通过字符串定义 JavaScript 命名空间

javascript - 强制移动设备激活 :hover CSS properties on first touch and activate link on second touch

javascript - 禁用某些基础 css/javascripts 时出错

javascript - 是否可以从不同的java脚本文件中调用worker.postmessage和worker.onmessage,以使用一个worker.js?

multithreading - HTML5 Web Worker 是针对一个页面还是跨页面

javascript - 无法在 Cordova 内使用postMessage