【发布时间】:2015-04-08 14:43:27
【问题描述】:
我很想把一个事件包装在一个承诺中。
更具体地说,我希望有一种方法可以让 promise 从每个发出的事件中返回值。
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] 的 promise 包装器。
//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"])
【问题讨论】:
-
承诺只解决或拒绝一次。这就是他们的承诺。 Promise不能替换事件发射器。如果您有兴趣,可以在函数式反应式编程世界中替代事件发射器的是可观察的。一个使用它的库的例子是bacon.js。
-
感谢@FlorianMargaine 我正在玩 bacon.js,但我真的不明白。 node 的例子不多,socket.io 的例子更少。
标签: node.js events socket.io promise bluebird