2012-11-30 82 views
1

我试图缩小与我的node.js服务器有关的内存问题的潜在原因。我一直感到有点不舒服的一部分代码是我使用Q的承诺。Node.js与Q :: Q.ninvoke承诺

这里是我的基本结构是什么样子:

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,该怎么办?一切都在这里正确的范围?

回答

3

这对我来说看起来很稳固。只要它暴露Node.js回调API(例如,通过nodeify;请参阅最近更新的API reference),this.doSomethingElse使用promise就没有问题。

-

这就是说,我会重写你的函数如下:

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

,如果你在第二个函数取决于第一个结果的情况下,不同的是一个给定的在这里,我愿意做

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性能和内存,结果主要在未发布的主分支。特别是:

+0

纠正我,如果我错了,但Q.all意味着异步执行。我没有在我的示例中明确指出我需要按顺序运行,但通常我的第二个函数依赖于第一个函数的结果。事实如此,我的例子就是“最好的方式?”还是有更好的? –

+0

承诺本质上具有异步执行,所以我不确定你的意思。 对于依赖第一个结果的第二个函数,'then'确实是正确的选择。包括的例子。 – Domenic