6

現在、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. これら 2 つのパターンに焦点を当てて、Q から BlueBird または Vow に移行するにはどうすればよいですか (ただし、「then」の使用についての説明も素晴らしいでしょう)。
4

1 に答える 1

12

はい、Bluebird は Q よりも 2 桁速く、はるかにデバッグしやすくなっています。ベンチマークを自分で見ることができます。

コードに関しては:

  • Q()Bluebird にマップさPromise.resolveれます (ES6 ネイティブの promise と同様)。*
  • Q.deferthis answerPromise.defer()で説明されているように、promise コンストラクターまたは自動 promisification を使用する方が良いオプションですが、にマップされます。つまり、promise コンストラクターは安全にスローされます。

注* - Promise をキャストすると、他のライブラリから thenables が自動的に同化されるため、これで問題ありません。

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;
});
于 2014-05-19T17:38:09.477 に答える