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"])
承諾只解決或拒絕** **一次。這就是他們的承諾。承諾**不能**取代事件發射器。如果你感興趣的話,什麼可以替代事件發射器,在功能反應式編程世界中,它們是可觀察的。一個使用它的庫的例子是[bacon.js](https://baconjs.github.io/)。 –
謝謝@FlorianMargaine我正在玩bacon.js,但我真的不明白。節點的例子並不多,使用socket.io的例子更少。 – ThomasReggi