将Q迁移到BlueBird(或Vow)

我目前在Node / amqp应用程序中使用Q promise库。 我已经读过,像BlueBird或者Vow这样的Q库的性能是不太好的。

不幸的是,我不知道如何使用BlueBird(或Vow)来取代我目前的Q使用模式。

这是一个例子:

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; }); 

我应该提到 – 我正在使用TypeScript …在这个例子中,我正在接受一个amqplib承诺,并创build一个Q承诺(因为我不喜欢amqplib承诺)。 我如何用BlueBird或Vow做到这一点?

另一个例子是:

 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; } 

这个模式是如何实现的?

所以我的一般问题是:

  1. 我读过的关于真实的性能差异?
  2. 我如何从Q迁移到BlueBird或者Vow,重点关注这两种模式(但是使用“then”的解释也会很棒)?

是的,Bluebird比Q快了两个数量级,而且更可debugging。 你可以自己看看基准。

至于代码:

  • Q()映射到Bluebird中的Promise.resolve (就像在ES6原生promise中一样)*
  • Q.defer映射到Promise.defer()虽然这是一个更好的select使用承诺的构造函数或自动promisification解释在这个答案 。 总之,诺言构造函数是安全的。

注意* – 一旦你承诺,它会自动从其他库同化吸食 – 所以这是非常好的:

 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; });