Node.js使用Q :: Q.ninvoke链进行Promise

时间:2012-11-30 21:16:21

标签: node.js promise q

我正在尝试缩小我在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怎么办?这里的一切都是正确的吗?

1 个答案:

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