node.js - 等待有 promise 的事件

标签 node.js events socket.io promise bluebird

我很乐意将一个事件包裹在一个 promise 中。

更具体地说,我希望有一种方法可以 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 时,存在一个问题,即广播发射 .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"])

最佳答案

就像 Florian 所说:Promise 不是事件发射器

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

如果 promise 采用单个值并向其添加时间元素。您正在尝试获取多个值(值的迭代)并为其添加时间。这称为 Observable,而不是 Promise。 promise 并不是解决您的问题的好模型。

这是一个使用 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);

关于node.js - 等待有 promise 的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29501249/

相关文章:

javascript - Electronjs Mysql数据库提交查询随机访问

node.js - Browserify 尝试在错误路径上查找模块

javascript - 为什么一个按钮会导致我的整个网页重新加载?

java - 在 nkzawa socket.iO-client 上添加自定义参数以进行握手

node.js - 在单独的 nodeJS 实例上共享套接字

javascript - gulp watch 只运行两次

javascript - 检测 Node 中变量值的变化

javascript - JQuery 将值传递给接受事件对象参数的函数

c# - 使用自定义参数取消订阅/删除事件处理程序

javascript - socket.io 是否像 sockjs 一样具有原始 WebSocket 访问权限?