等待有承诺的事件
Waiting for events with a promise
我很乐意将事件包装在一个承诺中。
更具体地说,我希望有一种方法来承诺 return 是每个发出的事件的值。
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
的事件。我喜欢的是 returns [6, 4, 14, 11]
.
的承诺包装器
//eventWrapper(emissions, event, [eventArguments])
eventWrapper(4, eventEmitter, "add").then(console.log) // [6, 4, 14, 11]
理想情况下还有一个超时参数,因此如果排放没有 return 并且在 x
秒内满足排放,则会出现错误。
最后(我知道这已经有点过了),但是当涉及到 socket.io 时,存在一个问题,即广播的发射 .on
处理程序不会 return 回调,在这种非常专业的用途中,事件可以代理为由完全不同的事件处理,就像这样。
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 不是事件发射器。
一个承诺代表一个单一的价值+时间。但是,在您的代码中,您试图表示一个被多次调用的事件。
如果一个承诺采用单个值并向其添加时间元素。您正在尝试获取多个值(值的迭代)并为其添加时间。这称为 Observable 而不是 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);
我很乐意将事件包装在一个承诺中。
更具体地说,我希望有一种方法来承诺 return 是每个发出的事件的值。
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
的事件。我喜欢的是 returns [6, 4, 14, 11]
.
//eventWrapper(emissions, event, [eventArguments])
eventWrapper(4, eventEmitter, "add").then(console.log) // [6, 4, 14, 11]
理想情况下还有一个超时参数,因此如果排放没有 return 并且在 x
秒内满足排放,则会出现错误。
最后(我知道这已经有点过了),但是当涉及到 socket.io 时,存在一个问题,即广播的发射 .on
处理程序不会 return 回调,在这种非常专业的用途中,事件可以代理为由完全不同的事件处理,就像这样。
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 不是事件发射器。
一个承诺代表一个单一的价值+时间。但是,在您的代码中,您试图表示一个被多次调用的事件。
如果一个承诺采用单个值并向其添加时间元素。您正在尝试获取多个值(值的迭代)并为其添加时间。这称为 Observable 而不是 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);