2014-05-19 22 views
6

Attualmente utilizzo la libreria Q promise in un'app Node/amqp. Ho letto che le prestazioni delle librerie Q vs come BlueBird o Vow sono ... non così buone.Migrazione da Q a BlueBird (o Voto)

Sfortunatamente, non riesco a capire come usare BlueBird (o Vow) per sostituire i miei attuali schemi di utilizzo Q.

Ecco un esempio:

this.Start = Q(ampq.connect(url, { heartbeat: heartbeat })) 
    .then((connection) => { 
     this.Connection = connection; 
     return Q(connection.createConfirmChannel()); 
    }) 
    .then((channel) => { 
     this.ConfirmChannel = channel; 
     channel.on('error', this.handleChannelError); 
     return true; 
    }); 

avrei dovuto detto - sto usando dattiloscritto ... In questo esempio mi sto prendendo un amqplib promesse, e la creazione di un Q promessa fuori di esso (perché Non mi piacciono le promesse di amqplib). Come faccio a farlo con BlueBird o Vow?

Un altro esempio è:

public myMethod(): Q.Promise<boolean> { 
    var ackDeferred = Q.defer<boolean>(); 

    var handleChannelConfirm = (err, ok): void => { 
     if (err !== null) { 
      //message nacked! 
      ackDeferred.resolve(false); 
     } 
     else { 
      //message acked 
      ackDeferred.resolve(true); 
     } 
    } 

    ...some other code here which invokes callback above... 

    return ackDeferred.promise; 
} 

Come è che modello implementato?

Così le mie domande generale è:

  1. sono le differenze di prestazioni che ho letto sulla vera?
  2. Come faccio a migrare da Q a BlueBird o Voto, con un focus su questi due pattern (ma una spiegazione dell'uso di "then" sarebbe grande anche questa)?

risposta

12

Sì, Bluebird è due ordini di grandezza più veloce di Q ed è molto più eseguibile. Puoi guardare tu stesso i parametri di riferimento.

quanto riguarda il codice:.

  • Q() mappe a Promise.resolve a Bluebird (proprio come in ES6 promesse nativi) *
  • Q.defer mappe a Promise.defer() anche se è una scelta migliore per utilizzare il costruttore promessa o automatico promisurazione come spiegato in this answer. In breve, il costruttore della promessa è sicuro.

Nota * - una volta che hai lanciato la promessa, sarà assimilare thenables da altre biblioteche automaticamente - quindi questo è perfettamente bene:

this.Start = Promise.resolve(ampq.connect(url, { heartbeat: heartbeat })) 
.then((connection) => { 
    this.Connection = connection; 
    return connection.createConfirmChannel()); 
}) 
.then((channel) => { 
    this.ConfirmChannel = channel; 
    channel.on('error', this.handleChannelError); 
    return true; 
}); 
+0

diritta attraverso la mappatura - Sono fuori la 'Q '! – Michael