2

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

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

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

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

4

3 回答 3

1

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

事件发射器收集器

享受...

于 2013-10-29T08:09:06.983 回答
0

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

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

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

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

于 2013-10-07T06:29:28.950 回答
-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(',') + ']');
于 2013-12-23T09:11:33.880 回答