【问题标题】:EventEmitter implementation that allows you to get the listeners' results?允许您获取侦听器结果的 EventEmitter 实现?
【发布时间】:2013-10-13 10:18:15
【问题描述】:

我意识到 nodejs 有一个强大的 EventEmitter 构造函数,它允许你发出事件。但是,EventEmitter 缺少的是一种让事件发射器查看侦听器返回的方法。

这是我追求的功能:

e = new FantasticEventEmitter();

e.on( 'event1', function( param1, param2, cb ){
  console.log("First listener called...")
  cb( null, 10 );
});

e.on( 'event1', function( param2, param2, cb ){
   console.log("Ah, another listener called!");
   cb( null, 20 );
});

e.emit( 'event1', 'firstParameter', 'secondParameter', function( err, res ){
  console.log("Event emitted, now res will be [ 10, 20]");
});

基本上,我希望监听器能够注册,在事件触发时被调用,

  • 向侦听器传递回调参数。回调将“收集”结果
  • 发射器有一个回调,将与结果集合一起调用

在我重新发明轮子之前,是否有一个库已经这样做了?

【问题讨论】:

  • 即使在发布了这个问题之后,我也看了又看,但是......不,我找不到现成的库。我认为最好的方法是从 EventEmitter 继承并重写emit(),以便在将回调添加到其参数后使用async 调用allListeners。这样做很简单,但是……从来没有人这样做过?也从来不需要它?真的吗?

标签: node.js events hook


【解决方案1】:

没有简单的方法可以做到这一点。为了满足我的要求,我编写了这个 GutHub 模块:

EventEmitterCollector.

享受...

【讨论】:

    【解决方案2】:

    如果我错了,请纠正我,但我认为不应该如此。事件发射器不应返回回调结果。如果使用正确,Eventemiiters 是异步函数调用的替代方案。您不应该尝试将它们结合起来并使事情复杂化。

    如果你正确使用它们,你可以在没有异步的情况下做你想做的事。 eventemitter 没有通用的方法。这是我的做法:

    • 事件incoming:处理参数并以任何方式触发stepn
    • 事件stepn:每个步骤都不同,执行每个步骤并在结束时调用collect 或调用另一个中间步骤。
    • 事件collect:存储输出检查是否完成,并在何时调用done 完成的。
    • 事件done:最终回调(可以在collect本身中完成)。

    这完全是我的观点/我学到的:异步回调是内部事件执行的最终结果。如果您要在低级别实现异步作业,您会这样做。在函数回调和其他东西的高层次上,你会使用async

    【讨论】:

    • 我看不出手工做某事会有什么好处,而不是用一种简单、直接的方式来查看听众以异步方式返回的内容......
    • 从易于使用的 POV 来看,这很简单,而不是易于实施。像开发人员一样思考,而不是像用户一样思考。异步回调是建立在底层同步操作之上的抽象。
    • Err... 我想我就像一个喜欢保持理智的开发人员一样。请看我自己的答案...
    【解决方案3】:

    也许我误解了您的问题,但是您原始问题中所需的结果代码应该可以正常工作。您可以将回调函数作为参数传入。您定义的 EventEmitter 实例已经可以采用回调参数。我做了一个例子,展示了如何在对原始文件稍加改动的情况下做你想做的事。

    var EventEmitter = require('events').EventEmitter;
    
    var e = new EventEmitter();
    
    // first listener
    e.on('whatever', function(x,cb) {
        console.log('first listener');
        cb(10);
    });
    
    // second listener
    e.on('whatever', function(x,cb) {
        console.log('second listener');
        cb(20);
    });
    
    // emit logic
    var res = [];
    e.emit('whatever', 'parameter', function(val) {
        res.push(val);
    });
    console.log('Event emitted, now res will be [' + res.join(',') + ']');
    

    【讨论】:

      猜你喜欢
      • 2021-07-05
      • 1970-01-01
      • 2011-12-21
      • 2015-12-18
      • 2016-05-07
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多