plainToClass 在网络工作线程中调用 object.method()

plainToClass to call object.method() in web worker thread

我正在使用 angular,试图将对象传递给后台进程的网络工作者。 class 是

Article{
  method1();
  propertyA;
}
addEventListener('message', ({ data }) => {
  // if without plainToClass, how to call article.method1()
  data.article=plainToClass(Article, data.article);
  console.log(data.article.method1());
});

因为在web worker线程中,我想使用article.method1(),

  1. 对象传给web worker后,就变成了一个没有方法只有属性的对象。为什么是这样?作为字符串传递?

  2. 尝试使用 plainToClass() 将传递的 obj 转换为带有方法的对象,在主线程中我可以这样做,加载字符串并转换为 Class目的。但在 web worker 中,它抱怨 Reflect.getMetadata is not a function。似乎在 polyfills.ts

    中找不到导入的 import 'reflect-metadata'

答案:

原来我需要在文章class文件中导入这个

import 'reflect-metadata';
export class Article implements Clonable{
}

将数据传递给 Web worker 是由 serializing the object 完成的,因此您将无法传递行为。相反,您需要像示例中那样使用 plainToClass,或者您可以在辅助函数中提供功能。

此外,import reflect-metadata 是 side-effects 的导入。此代码是 run once per context,因此需要在 worker 内部再次 运行 ,然后 plainToClass 应该可以工作。

也就是说,更简单的方法可能是尝试使用传入的值调用 class 构造函数 - 如果可能的话?