Presumo che tu voglia fare una catena di cose diversa per ogni evento. Anche se eventB
viene attivato dalle azioni di connect
, puoi trattarlo come un altro flusso di logica.
Nota a margine: Per evitare confusione per voi e per chiunque altro che deve leggere questo codebase, vi consiglio contro integrando le promesse con metodi aggiuntivi se non si è molto approfondita su di loro documentazione.
Dal tuo esempio, sembra che quanto segue funzionerebbe.
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()
})
Se vuoi per semplificare questa costante
var p = new Promise(function(resolve){
emitter.on('something', resolve)
})
si può usare qualcosa di simile
function waitForEvent(emitter, eventType){
return new Promise(function(resolve){
emitter.on(eventType, resolve)
})
}
che trasforma la soluzione codice sopra in
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()
})
E perché funzioni in Ja vascript catturare l'ambito in cui sono stati definiti, questo codice potrebbe essere ulteriormente semplificata in
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()
})
Forse questo aiuterà: http://bahmutov.calepin.co/promisify-event-emitter.html –
versione cache: https://web.archive.org/web/201603201007 56/http: //bahmutov.calepin.co/promisify-event-emitter.html – user1278519