EventEmitter的实现,可以让你得到听众的结果?

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

这是我后面的function:

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]"); }); 

基本上,我希望听众能够注册,当事件被激发时被调用, 并且

  • 听众要传递一个callback参数。 callback将“收集”结果
  • 发射器有一个callback,将被调用结果集合

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

有没有简单的方法来做到这一点。 为了让我所要求的,我写了这个GutHub模块:

EventEmitterCollector 。

请享用…

纠正我,如果我错了,但我不认为这应该是。 事件发射器不应该返回callback结果。 Eventemiiters是asynchronous函数调用的替代方法,如果您正确使用它们。 你不应该试图把它们和复杂的东西结合起来。

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

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

这完全是我的看法/我学到了什么:asynchronouscallback是内部执行的最终结果。 如果你要在低层实现一个asynchronous工作,这就是你要做的。 在函数callback和东西的高层次,你会使用async

也许我误解了你的问题,但你原来的问题所需的结果代码应该只是工作。 你可以传入一个callback函数作为参数。 你定义的EventEmitter实例可以使用callback参数。 我做了一个例子,显示如何做你想要的东西,只需要对原来的东西做些小改动。

 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(',') + ']');