我正在尝试缩小我在node.js服务器上遇到的内存问题的可能原因。我一直有点不舒服的代码的一部分是我使用Q promises。
这是我的基本结构:
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函数也使用promises怎么办?这里的一切都是正确的吗?
答案 0 :(得分:3)
这对我来说非常可靠。 this.doSomethingElse
使用promises没有问题,只要它公开Node.js回调API(例如通过nodeify
;请参阅最近更新的API reference)。
-
那就是说,我会按如下方式重写你的功能:
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性能和内存,结果主要在未发布的主分支中。特别是:
Q.reject
Object.freeze
,slow in V8