1

node.jsサーバーで発生しているメモリの問題の潜在的な原因を絞り込もうとしています。私がいつも少し不快だったコードの一部は、Qpromiseの使用です。

私の基本的な構造は次のようになります。

var Q = require('q');
MyClass.prototype.doSomething = function(somedata, callback) {
    var res = [];// will contain the results of each function call

    Q.ninvoke(this, 'doSomethingElse', 'hello!')
    .then((function(result){
        res.push(result);
        return Q.ninvoke(this.someobject, 'someFunction', somedata);
    }).bind(this))
    .then((function(result){
        res.push(result);
        callback(null, res);// Returns both result objects, in an array
    }).bind(this))
    .fail(callback)
    .done();
}

これは論理的に見えますか?

doSomethingElse関数もpromiseを使用している場合はどうなりますか?ここではすべてが適切にスコープされていますか?

4

1 に答える 1

3

これは私にはかなり堅実に見えます。this.doSomethingElseNode.jsコールバックAPIを公開している限り(たとえば、nodeify;最近更新されたAPIリファレンスを参照)、promiseを使用しても問題はありません。

-

そうは言っても、私はあなたの関数を次のように書き直します:

MyClass.prototype.doSomething = function(somedata, callback) {
    return Q.all([
        Q.ninvoke(this, 'doSomethingElse', 'hello!'),
        Q.ninvoke(this.someobject, 'someFunction', somedata)
    ]).nodeify(callback);
};

ここで示したものとは異なり、2番目の関数が最初の関数の結果に依存している場合は、

MyClass.prototype.doSomething = function(somedata, callback) {
    return Q.ninvoke(this, 'doSomethingElse', 'hello!').then(function (result) {
      return Q.invoke(this.someobject, 'someFunction', result);
    }.bind(this))
    .nodeify(callback);
};

または多分

MyClass.prototype.doSomething = function(somedata, callback) {
    var doSomethingElse = Q.nfbind(this.doSomethingElse.bind(this));
    var someFunction = Q.nfbind(this.someobject.someFunction.bind(this.someobject));

    return doSomethingElse('hello!').then(someFunction).nodeify(callback);
};

-

より一般的には、最近Qのパフォーマンスとメモリに取り組んでおり、その結果は主にリリースされていないマスターブランチにあります。特に:

于 2013-01-27T23:58:10.743 に答える