为什么 Web worker 在模块导入时再次创建一个新的 Class 实例?

Why Web worker is creating a new Class Instance again on module import?

我们正在 web worker 上执行计时功能。我还有一个 Dispatcher Class,它为其他 classes 创建一个实例,如下所示:

class Dispatcher {
constructor() {
        console.log("calling");
        this.events = {};
    }
//some code
}
const dispatcher = new Dispatcher();
export default dispatcher;

我已将此模块导入到另一个名为 DataManager Class 的文件中:

import dispatcher from '../../utility/dispatcher';

export class DataManager {
  notifyRenderer = (data: ResultData): void => {
        dispatcher.dispatch(NOTIFY_EVENT, data);
  }
}

我的 web worker 正在创建这个 class 的新实例,我们从这里触发了一个用 DataManager Class.

编写的 notifyRenderer 方法
import { DataManager } from "./data-manager";
let dm: DataManager;

addEventListener('message', (e) => {
    if (!dm) {
        dm = new DataManager();
    }

    const res = dm.addOrUpdateData(e.data.input, true);
    dm.notifyRenderer(res);
    postMessage({ type: 'Dispatch', res });
}, false);

另外,我附上了显示 console.log("calling") 的控制台屏幕截图;两次。我不知道为什么 Dispatch class 构造函数被调用两次。

我有没有做错。在这方面需要帮助。

我觉得模块导入可能是问题所在。是吗?

添加来自工作人员的屏幕截图跟踪:

提前致谢!

每个人都从那里的错误和实践中吸取教训,同样的事情也发生在我身上。

我的模块中的一切都是正确的,它是 Dispatcher Class、Data Manager Class 并实例化一个新的工作线程。问题是我在该模块的末尾创建了一个 Dispatcher Class 实例,因为我认为生成的导出将被缓存(根据 mjs(require) 文件缓存机制,)并尝试使用(导入)在主线程和工作线程中,两个线程都在创建自己的模块实例版本。(我的错误!)

直到 bergi 给了我提示,我才意识到。正确的方法是使用 postmessage 将数据从工作线程发送到主线程,并在主线程上监听。

从工作线程发送:

postMessage(dm.addOrUpdateData(e.data.input, true) as ResultData);

在主线程上监听:

this.worker.onmessage = (e: MessageEvent) => {
            if (!e.data) return;
            dispatcher.dispatch(NOTIFY_EVENT, e.data);
        };

了解有关 Realms 的更多信息和帮助链接必须访问:

谢谢!