javascript - 将事件从一个事件发射器转发到另一个

标签 javascript node.js eventemitter

我有一个事件发射器(一个转换流),该事件发射器基本上有一堆子发射器。

我想将事件从所有子发射器转发到父发射器,如下所示:

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/

相关文章:

javascript - 使用jquery了解选择表单中未选择的值

node.js - 如何从nodejs模块导出函数获取回调数据

javascript - 如何使用 Node.js 轻松地将变量传递到 View

Angular 5 EventEmitter 运行不正常

javascript - 并行执行的事件发射器与 promise ?

javascript - eventemitter.emit 方法在 Node js 中不返回

javascript - 如何在播放前完全加载音频?

javascript - 如何在行单击时获取数据表的ID

javascript - 测试 React 组件是否已经渲染

node.js - Nodejs Jest 单元测试无法从 Mongodb 查找、findOne 内部返回值