Node.js 带着承诺等待事件

Node.js 带着承诺等待事件,node.js,events,socket.io,promise,bluebird,Node.js,Events,Socket.io,Promise,Bluebird,我想用承诺来包装一件事 更具体地说,我希望能有一种方法来保证从每个发出的事件返回值 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

我想用承诺来包装一件事

更具体地说,我希望能有一种方法来保证从每个发出的事件返回值

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"])
我需要一种方法来传递第二个事件,并将回调代理到该事件,而不是查看回调的原始事件

理想情况下,函数如下所示

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"])

正如弗洛里安所说:承诺不是事件发送者

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

如果一个承诺是接受一个值并向其添加一个时间元素。您试图获取多个值(值的迭代)并为其添加时间。这被称为可观察的,而不是承诺。承诺不是解决你问题的好榜样

下面是一个使用RxJS的示例,因为EcmaScript()中还没有可观察对象:


承诺只能解决或拒绝一次。这就是他们的承诺。承诺不能取代事件发射器。如果您感兴趣的话,在函数式反应式编程世界中,可以替代事件发射器的是可观察的。一个图书馆使用它的例子是。谢谢@FlorianMargaine我正在玩bacon.js,但我真的不明白。关于node的例子不多,而关于socket.io的例子更少。