我意识到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]");
});
基本上,我希望听众能够注册,在事件被触发时被调用,和:
在我重新发明轮子之前,是否有一个库已经这样做了?
答案 0 :(得分:1)
答案 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(',') + ']');