从静态方法调用中发出事件的最佳方法是什么,或者有最佳实践或解决方法?
假设我有一个调用upload
的ES6类,并将目录中的文件递归地上传到某个端点,我希望在每个文件成功上传后发出一个事件。我知道我可以让类继承EventEmitter
,但如果没有实例化类的新实例,则.on
和.emit
函数不存在。有没有办法解决这个问题?
答案 0 :(得分:3)
没有办法绕过它。如果您想拨打.emit()
,那么您需要EventEmitter
的某个实例,您可以在其中调用.emit()
。当然,这是有道理的,因为你的其他代码必须要用.on()
来调用监听器。
如果您不需要为每个对象使用单独的发射器,您可以只创建一个共享发射器,您可以将其存储在某个其他对象,某些有用的范围或模块范围中,或者甚至可以使单个发射器成为类静态。如果发射器实例是静态类(在启动时初始化),那么静态方法都可以引用它。
答案 1 :(得分:0)
jfriend00是正确的,没有创建EventEmitter实例是没有办法的,但是使用Singleton模式可以实现解决问题的方法,例如:
这是单例“ eventEmitterHandler.ts”
import {EventEmitter} from "events";
export default class EventEmitterHandler extends EventEmitter {
private static instance: EventEmitterHandler;
private constructor() {
super();
}
static getInstance() {
if (!EventEmitterHandler.instance) {
EventEmitterHandler.instance = new EventEmitterHandler();
}
return EventEmitterHandler.instance;
}
}
带有静态方法的类
import EventEmitterHandler from "./eventEmitterHandler";
export default class ClassA {
constructor() {}
public static staticMethod() {
EventEmitterHandler.getInstance().emit('wave');
}
}
订阅事件的课程
import EventEmitterHandler from "./eventEmitterHandler";
export default class ClassB {
constructor() {
EventEmitterHandler.getInstance().on('wave', () => {
console.log('constructor wave');
});
}
}