用承诺等待事件

我很乐意在一个承诺中包装一个事件。

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

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来说,有一个问题是广播的处理程序不会返回callback,在这个非常特殊的用途中,事件可以被代理为由一个完全不同的事件处理,像这样。

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

而不是看callback的原始事件,我需要一种方式来传递第二个事件,并代理该事件的callback。

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

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

像弗洛里安说的: 一个承诺不是事件发射器

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

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

这里是一个使用RxJS的例子,因为observables还没有在EcmaScript中( 但是他们正在路上 ):

 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);