我有一个事件发射器(一个转换流),该事件发射器基本上有一堆子发射器。
我想将事件从所有子发射器转发到父发射器,如下所示:
const EE = require('events');
const exportEvents = new EE();
const sumanEvents = Transform(); // create new transform stream (an event emitter)
sumanEvents.on('test', function () {
exportEvents.emit.bind(exportEvents, 'test').apply(exportEvents, arguments);
});
sumanEvents.on('error', function () {
exportEvents.emit.bind(exportEvents, 'error').apply(exportEvents, arguments);
});
sumanEvents.on('suman-test-file-complete', function () {
exportEvents.emit.bind(exportEvents, 'suman-test-file-complete').apply(exportEvents, arguments);
});
基本上,据我所知,我已将错误、测试和 suman-test-file-complete 事件转发给父级,但这看起来很丑陋。
至少有更复杂的方法吗?我认为没有办法直接使用 Node.js 的“事件”包继承事件,所以我不会问这个问题。
最佳答案
您可以覆盖 sumanEvents.emit()
,这样您就可以看到发出的任何事件,然后抓取它并将其回显到 exportEvents
:
(function(origEmitter, forwardEmitter) {
// save original .emit method
let oldEmit = origEmitter.emit;
// assign override
origEmitter.emit = function() {
// allow the event to be normally emitted
oldEmit.apply(origEmitter, arguments);
// then forward it to the forwardEmitter
forwardEmitter.emit.apply(forwardEmitter, arguments);
};
})(sumanEvents, exportEvents);
或者,放入一个可重复使用的函数形式,这样您就可以在多个发射器上使用它而无需复制代码:
function forwardEmitter(origEmitter, forwardEmitter) {
// save original .emit method
let oldEmit = origEmitter.emit;
// assign override
origEmitter.emit = function() {
// allow the event to be normally emitted
oldEmit.apply(origEmitter, arguments);
// then forward it to the forwardEmitter
forwardEmitter.emit.apply(forwardEmitter, arguments);
};
}
forwardEmitter(sumanEvents, exportEvents);
如果您想更轻松地重用此功能,可以将其封装在派生自 EventEmitter
的新对象中,但这只有在您控制第一个 EventEmitter 对象的创建时才有效因此您可以将其作为支持转发所有消息的特殊派生对象。上面的示例可以“添加”到任何现有的常规 EventEmitter
对象。
还有一个 EventEmitter2
对象 described here这允许您使用通配符来注册事件处理程序,这样您就可以注册对所有事件或事件子集的兴趣,而无需单独命名每个事件。
并且,在 Google 邮件列表中有关于此概念的讨论:https://groups.google.com/forum/#!topic/nodejs-dev/TzRPxsHf0FA
关于javascript - 将事件从一个事件发射器转发到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40856154/