将Q迁移到BlueBird(或誓言)

时间:2014-05-19 17:29:54

标签: node.js promise q bluebird

我目前在Node / amqp应用程序中使用Q promise库。我已经读过Q对像BlueBird或Vow这样的库的表现......不太好。

不幸的是,我无法弄清楚如何使用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的承诺,并从中创建一个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'的解释也会很棒)?

1 个答案:

答案 0 :(得分:12)

是的,Bluebird比Q快两个数量级,并且可调试性更强。您可以自己查看基准测试。

至于代码:

  • Q()映射到Bluebird中的Promise.resolve(就像在ES6本机承诺中一样)。*
  • Q.defer映射到Promise.defer()尽管使用promise构造函数或自动promisification是更好的选择,如in this answer所述。简而言之,promise构造函数是安全的。

注意* - 一旦你投下了承诺,它就会自动吸收其他图书馆的版本 - 所以这很好:

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