如何使用显示模块模式扩展节点EventEmitter?

时间:2013-11-12 18:11:12

标签: node.js amd eventemitter node-modules

我一直在尝试使用节点events.EventEmitter和我的amdefine模块(Revealing Module Pattern)。我有一段工作代码,我实现了一个“on”函数并将其传递给EventEmitter。

if (typeof define !== 'function') {
    var define = require('amdefine')(module);
}

define(function (require) {

    var events = require('events');
    var emitter = new events.EventEmitter();

    function doSomething(strParam) {
        console.log('doSomething: ' + strParam);
        emitter.emit('done');
    }

    return {
        do: function(strParam) {
            doSomething(strParam);
        },
        on: function(event, callback) {
            emitter.addListener(event, callback);
        }
    }
});

这可以胜任。但是,似乎更好的方法是继承 - 所以我可以利用所有的EventEmitter属性

[mycode].prototype.__proto__ = events.EventEmitter.prototype;

但是,我无法弄清楚如何使用上面的RMP模式。有没有人有任何建议?

1 个答案:

答案 0 :(得分:1)

我也想到了这一点。在寻找解决方案时,我遇到了您的问题,随后提出了一个可行的解决方案。

var events = require('events');

describe('test something', function() {

    var Person = function() {
        var evem = new events.EventEmitter();
        var funcs = {
            promote: promote
        };

        function promote() {
            evem.emit('promoted');
        }

        proxyFunctions(funcs, evem, ['on']);

        return Object.freeze(funcs);
    };

    function proxyFunctions(source, target, functions) {
        for (var i = 0; i < functions.length; i++) {
            var functionName = functions[i];
            source[functionName] = function() {
                return target[functionName].apply(target, arguments);
            };
        }
    }

    it('can add event handlers', function(done) {
        var p = new Person();
        p.on('promoted', function() {
            done();
        });
        p.promote();

    });

});

https://gist.github.com/REAANDREW/10552871