I assume you want to do a different chain of things for each event. Even if eventB
is triggered by the actions of connect
, you can treat it like another stream of logic.
Side note: To avoid confusion for you and anyone else who has to read this codebase, I'd recommend against supplementing promises with additional methods unless you are very thorough about documenting them.
From your example, it seems like the following would work.
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(){
return x.doSomething()
}).then( function(){
return y.doSomethingElse() // will trigger `eventB` eventually
})
// this promise stream will begin once `eventB` has been triggered
eventBHappened.then( function(){
return z.doSomething()
})
If you'd like to simplify this constant
var p = new Promise( function( resolve ){
emitter.on( 'something', resolve )
})
You can use something like this
function waitForEvent( emitter, eventType ){
return new Promise( function( resolve ){
emitter.on( eventType, resolve )
})
}
Which turns the code solution above into
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(){
return x.doSomething()
}).then( function(){
return y.doSomethingElse() // will trigger `eventB` eventually
})
// this promise stream will begin once `eventB` has been triggered
waitForEvent( emitter, 'eventB' ).then( function(){
return z.doSomething()
})
And because functions in Javascript capture the scope where they were defined, this code could be further simplified to
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(){
return x.doSomething()
}).then( function(){
return y.doSomethingElse() // will trigger `eventB` eventually
})
// this promise stream will begin once `eventB` has been triggered
waitForEvent( 'eventB' ).then( function(){
return z.doSomething()
})
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…