如何在node.js中仅共享*对象的事件?

时间:2017-05-12 18:23:49

标签: javascript node.js events eventemitter

我希望对象B订阅事件而不是对象A发出 - 但是,我不想将对象B本身传递给A,因为有可能是另一个开发人员(或者我自己未来)滥用B中B的存在,从而将这两个项目紧密结合在一起。有没有办法我只能将B的事件发射器方面传递给A,这样A可以从(即读取)B接收事件,但不能操纵(即写入)B?

我能想到的一个简单的解决方案是创建一个新的EventEmitter C,然后将C订阅到B的所有事件,处理程序发出相同的事件,然后将C传递给A.

是否有更简单的解决方案?

1 个答案:

答案 0 :(得分:0)

您要求的通常术语是代理。

您创建一个新对象。只提供您要公开的方法。在一个私有闭包中,你有实际的eventEmitter对象,你想要公开的几个方法只能对实际的eventEmitter对象进行操作,但只有访问权限的人才能修改实际的eventEmitter对象或使用发射器上的任何方法你没有在代理中明确公开。这是一个简单的例子,只允许通过代理使用.on()方法(不能调用发射器上的其他方法)。

class EmitterProxy {
    constructor(emitter) {
        // add method that has access to emitter
        this.on = function(event, fn) {
            let self = this;
            return emitter.on(event, function() {
                // this makes sure that the value of this is the EmitterProxy
                // instance and not the emitter instance
                fn.apply(self, arguments);
            });
        }

        // define any other methods you want to proxy
    }
}

然后,在您的代码中,您创建代理并将其传递给实际的eventEmitter。然后,您可以与任何人共享代理对象。他们可以听取它上面的事件,但他们不能对发射器本身做任何其他事情。

let proxy = new EmitterProxy(actualEmitter);

然后将代理传递给其他只能访问一种方法的代码。

// other code can do this
proxy.on('finish', () => { /* do something here */ });