但这看起来很丑。
您是否有理由进行绑定和申请?似乎这些使用不正确。像exportEvents.emit.bind(exportEvents, 'test').apply(exportEvents, arguments) 这样的行可以简化为EE.emit.apply(exportEvents, 'test', arguments),或者使用扩展语法,exportEvents.emit('test', ...arguments)
话虽如此,实用功能在这里可能会有所帮助。 jfriend00's above solution 没问题,但我不太喜欢它覆盖原始对象上的方法(即使正在调用原始方法)。
另一个解决方案实际上更简单(代码行更少):
function forwardEvent(emitterToListenOn, emitterToEmitOn, event) {
emitterToListenOn.on(event, function() { //can't use arrow here, as we need 'arguments'
emitterToEmitOn.emit(event, arguments);
});
}
function forwardEvents(emitterToListenOn, emitterToEmitOn, events) {
events.forEach(event => forwardEvent(emitterToListenOn, emitterToEmitOn, event));
}
function forwardEventsToMultipleEmitters(emitterToListenOn, emittersToEmitOn, events) {
emittersToEmitOn.forEach(emitterToEmitOn => forwardEvents(emitterToListenOn, emitterToEmitOn, events));
}
对于那些不熟悉箭头函数的人,这里是相同的代码,但没有:
function forwardEvent(emitterToListenOn, emitterToEmitOn, event) {
emitterToListenOn.on(event, function() { //can't use arrow here, as we need 'arguments'
emitterToEmitOn.emit(event, arguments);
});
}
function forwardEvents(emitterToListenOn, emitterToEmitOn, events) {
events.forEach(function(event) {
forwardEvent(emitterToListenOn, emitterToEmitOn, event);
});
}
function forwardEventsToMultipleEmitters(emitterToListenOn, emittersToEmitOn, events) {
emittersToEmitOn.forEach(function(emitterToEmitOn) {
forwardEvents(emitterToListenOn, emitterToEmitOn, events);
});
}
要在您的原始代码中使用这些,
const EE = require('events');
const exportEvents = new EE();
const sumanEvents = Transform(); // create new transform stream (an event emitter)
forwardEvents(sumanEvents, exportEvents, ['test', 'error', 'suman-test-file-complete']);
这个forwardEvent 的代码行数比jfriend00 的forwardEmitter 少,并且没有覆盖任何函数,最终的解决方案对我来说看起来很干净。