2015-04-07 200 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);