Я предполагаю, что вы хотите сделать другую цепочку вещей для каждого события. Даже если eventB
запускается действиями connect
, вы можете рассматривать его как другой поток логики.
Side Примечание: Для того, чтобы избежать путаницы для вас и всех, кто должен прочитать эту кодовую, я бы не рекомендовал дополняющего обещаний с дополнительными методами, если вы не очень тщательно об их документирования.
Из вашего примера, похоже, что следующее будет работать.
var Promise = require('bluebird')
var emitter = someEmitter()
var connected = new Promise(function(resolve){
emitter.on('connect', resolve)
})
var eventBHappened = new Promise(function(resolve){
emitter.on('eventB', resolve)
})
connected.then(function(){
x.doSomething()
}).then(function(){
y.doSomethingElse() // will trigger `eventB` eventually
})
// this promise stream will begin once `eventB` has been triggered
eventBHappened.then(function(){
z.doSomething()
})
Если вы хотите, чтобы упростить эту постоянную
var p = new Promise(function(resolve){
emitter.on('something', resolve)
})
Вы можете использовать что-то вроде этого
function waitForEvent(emitter, eventType){
return new Promise(function(resolve){
emitter.on(eventType, resolve)
})
}
который превращает раствор кода выше в
var Promise = require('bluebird')
var emitter = someEmitter()
function waitForEvent(eventEmitter, eventType){
return new Promise(function(resolve){
eventEmitter.on(eventType, resolve)
})
}
waitForEvent(emitter, 'connect').then(function(){
x.doSomething()
}).then(function(){
y.doSomethingElse() // will trigger `eventB` eventually
})
// this promise stream will begin once `eventB` has been triggered
waitForEvent(emitter, 'eventB').then(function(){
z.doSomething()
})
И поскольку функции в Ja vascript захватить сферу, где они были определены, этот код может быть дополнительно упрощен до
var Promise = require('bluebird')
var emitter = someEmitter()
function waitForEvent(type){
return new Promise(function(resolve){
//emitter has been captured from line #2
emitter.on(type, resolve)
})
}
waitForEvent('connect').then(function(){
x.doSomething()
}).then(function(){
y.doSomethingElse() // will trigger `eventB` eventually
})
// this promise stream will begin once `eventB` has been triggered
waitForEvent('eventB').then(function(){
z.doSomething()
})
Возможно, это поможет: http://bahmutov.calepin.co/promisify-event-emitter.html –
кэшированная версия: https://web.archive.org/web/201603201007 56/http: //bahmutov.calepin.co/promisify-event-emitter.html – user1278519