为什么 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 的更多信息和帮助链接必须访问:
谢谢!
我们正在 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 的更多信息和帮助链接必须访问:
谢谢!