2015-04-07 51 views
2

我很想在承诺中包装一个事件。等待承诺的事件

更具体地说,我很想有一个方法来承诺,从每个发出的事件返回值。

var events = require('events') 
var eventEmitter = new events.EventEmitter() 

eventEmitter.on("add", function(data){ 
    console.log(data+1) 
    return data+1 
}) 

eventEmitter.emit('add', 5) 
eventEmitter.emit('add', 3) 

setTimeout(function(){ 
    eventEmitter.emit('add', 13) 
}, 1000) 

setTimeout(function(){ 
    eventEmitter.emit('add', 10) 
}, 3000) 

这是一个会发出6, 4, 14, 11的事件。我喜欢的是一个承诺包装,返回[6, 4, 14, 11]

//eventWrapper(emissions, event, [eventArguments]) 

eventWrapper(4, eventEmitter, "add").then(console.log) // [6, 4, 14, 11] 

理想的情况下有一个超时参数,以及因此如果排放不返回,并满足内x量秒有一个错误的排放。

最后(我知道这已经达到了一点),但是当涉及到socket.io时,有一个问题,在广播的emisson .on处理程序不会返回回调,在这个非常专业的使用中,事件可能是代理由一个完全不同的事件处理,像这样。

eventEmitter.on("callback", function(data){ 
    console.log(data+1) 
    return data+1 
}) 

eventEmitter.on("add", function(data){ 
    eventEmitter.emit("callback", data) 
}) 

不是看回调原始事件的,我需要一种方式,第二个事件经过,并代理回调到该事件。

理想情况下,功能看起来像这样。

//eventWrapper(numberOfExpectedReturnedEvents, delimiterTimeoutIntervalBetweenEvents, eventAndParameters, proxyEventAndParameters) 
eventWrapper(numberOfSockets, 5000, [socket.on, "action"], [socket.io, "callback"]) 
+4

承诺只解决或拒绝** **一次。这就是他们的承诺。承诺**不能**取代事件发射器。如果你感兴趣的话,什么可以替代事件发射器,在功能反应式编程世界中,它们是可观察的。一个使用它的库的例子是[bacon.js](https://baconjs.github.io/)。 –

+0

谢谢@FlorianMargaine我正在玩bacon.js,但我真的不明白。节点的例子并不多,使用socket.io的例子更少。 – ThomasReggi

回答

1

像弗洛里安说:承诺不发射的事件。

承诺代表单个值+时间。然而,在你的代码中,你试图表示一个被多次调用的事件。

如果承诺正在采取一个单一的值,并添加一个时间元素。你正在尝试采取多个值(一个值的迭代)并增加时间。这被称为可观察而不是承诺。承诺不是你的问题的好榜样。

下面是使用RxJS因为可观测量不在的EcmaScript尚未(but they're on their way)的示例:

var EventEmitter = require('events').EventEmitter; 
var emitter = new EventEmitter(); 

// an observable is what you use for multiple events 
// fromEvent is the `promisify` of observables, you can also create them 
// from sources - analogous to the promise constructor 
var observable = Rx.Observable.fromEvent(emitter, 'add'); 

// scanning a value and mappingthe result is done by `.scan` 
// note how the syntax is similar to promise 
// chaining - observables are functional and chain like promises 
// observables also consume promises and can produce promises 
observable = observable.map(function(val){ 
    return val + 1; 
}); 

// subscribe is like .done 
observable.subscribe(console.log);