ES6:从静态方法中发出事件

时间:2016-10-26 20:45:55

标签: javascript node.js ecmascript-6

从静态方法调用中发出事件的最佳方法是什么,或者有最佳实践或解决方法?

假设我有一个调用upload的ES6类,并将目录中的文件递归地上传到某个端点,我希望在每个文件成功上传后发出一个事件。我知道我可以让类继承EventEmitter,但如果没有实例化类的新实例,则.on.emit函数不存在。有没有办法解决这个问题?

2 个答案:

答案 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');
        });           
    }
}