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