我一直在尝试使用节点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模式。有没有人有任何建议?
答案 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();
});
});