3

我一直在尝试将节点 events.EventEmitter 与我的 amdefine 模块(显示模块模式)一起使用。我有一段工作代码,我在其中实现了一个“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 模式来做到这一点。有没有人有什么建议?

4

1 回答 1

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

于 2014-04-12T19:39:23.723 回答