【问题标题】:Classes in WebworkersWebworkers 中的类
【发布时间】:2018-04-17 17:55:45
【问题描述】:

主线程 JS 和 webworker 之间可以传递和不能传递什么?

我在 webworker 中有一个 JS 类,我想将它传递给他们的主线程。做这个的最好方式是什么?有没有办法将 JSON 对象映射到一个类上,还是我需要为此创建一个特殊的构造函数?

class HelloWorld{
    constructor(message){
        this.msg = message
    }
    getMessage(){
        debugger
        return this.msg;
    }
}
var a = new HelloWorld("hello WorlD")
postMessage(a)

主线程将其读取为 `{msg:"hello WorlD"} 剥离所有成员数据和 typeof 数据。

【问题讨论】:

  • 您不能将函数或类似的动态对象转发给网络工作者。你只能在主线程中为 webworker 提供一个接口来与这些东西进行交互
  • 你不能将函数传递给网络工作者,包括class构造函数。
  • 为了 100% 清楚,您的意思是您有一个由 class 语法定义的构造函数(与关联的 prototype),并且您想将该构造函数传递给 worker,对吗?或者您是在谈论传递通过调用它创建的类的 instance 吗?
  • @apsillers - 如果是这样的话,我首先质疑 Worker 的使用。为什么要生成一个进程只是为了加载您传递回主程序的代码?没有意义。 OP - 究竟是什么用例?

标签: javascript web-worker


【解决方案1】:

标准答案是structured clone algorithm

对于具体发送类实例的情况:

1- 使用console.log(a) 将其显示为 JS 对象显示如下:

{
  msg: "hello WorlD",
  __proto__: {
    constructor: ...,
    getMessage: ...,
    __proto__: {...}
  }
}

即,对于一个足够简单的类:可以大约说实例属性是普通对象属性,而实例函数是 __proto__ 属性上的属性。

2- 在structured clone algorithm 之后:msg 将被传递,但成员函数 getMessage 不会传递,因为“原型链不会被遍历和复制。”。

3- 如果成员函数不是原型链的一部分,而是直接定义为对象原型,则对象的整个传递将失败,因为无法发送 Function 对象。
例如,如果你尝试:a.getMessage2 = function() {return 7;},整个对象甚至都不会被传递。

4-我不知道您在这里使用 typeof 是什么意思,但如果您的意思是使用 messageEvent.data instanceof HelloWorld,那么这里的问题是主代码/线程不包含 web-worker 文件,因此不知道HelloWorld 的定义。
为了让他们都看到HelloWorld,您可以在两个文件中定义类,或者(1)在外部文件中定义它(例如,hello-world.js),(2)然后将其导入主代码/线程中将 <script src="hello-world.js"> 添加到您的 HTML,并 (3) 通过将 importScripts('hello-world.js') 添加到您的网络工作者文件的开头将其导入您的网络工作者代码。

免责声明:我在课堂上不是很了解。关于类实例将如何(并且可以)被视为 JS 对象,我使用了一些可能正确的假设。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2013-08-14
    相关资源
    最近更新 更多