1

我正在尝试缩小我的 node.js 服务器出现内存问题的潜在原因。我一直有点不舒服的代码的一部分是我对 Q Promise 的使用。

这是我的基本结构:

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

这对我来说看起来很可靠。使用 Promise没有问题this.doSomethingElse,只要它公开了一个 Node.js 回调 API(例如通过nodeify;参见最近更新的API 参考)。

--

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

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

于 2013-01-27T23:58:10.743 回答