EventEmitter实现,允许您获取监听器'结果如何?

时间:2013-10-06 22:28:56

标签: node.js events hook

我意识到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]");
});

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

  • 要传递回调参数的侦听器。回调将“收集”结果
  • 发射回调,将使用结果集合
  • 调用

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

3 个答案:

答案 0 :(得分:1)

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

EventEmitterCollector

...享受

答案 1 :(得分:0)

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

如果你正确使用它们,你可以做到你想要的而不是异步。 eventemitter没有通用的方法。我将如何做到这一点:

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

这完全是我的观点/我所学到的:异步回调是内部执行的最终结果。如果您要在低级别实现异步作业,那么就是这样做的。在高级别的函数回调和内容中,您将使用async

答案 2 :(得分:-1)

也许我误解了你的问题,但你原来问题中你想要的结果代码应该可行。您可以将回调函数作为参数传递。您定义的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(',') + ']');