【问题标题】:Node.js Promises with Q :: Q.ninvoke chainsNode.js Promises with Q :: Q.ninvoke 链
【发布时间】:2013-02-12 11:06:48
【问题描述】:

我正在尝试缩小我的 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 会怎样?这里的所有范围都正确吗?

【问题讨论】:

    标签: node.js promise q


    【解决方案1】:

    这对我来说看起来很可靠。 this.doSomethingElse 使用 Promise 没有问题,只要它公开了 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 性能和内存,结果主要在未发布的 master 分支中。特别是:

    【讨论】:

    • 如果我错了,请纠正我,但 Q.all 意味着异步执行。我没有在示例中明确说明我需要按顺序运行,但通常我的第二个函数依赖于第一个函数的结果。既然如此,我的例子是“最好的方式”吗?还是有更好的?
    • Promises 本质上是异步执行的,所以我不确定你的意思。对于依赖第一个结果的第二个函数,then 确实是正确的选择。包括示例。
    猜你喜欢
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 2014-05-30
    • 2014-07-03
    相关资源
    最近更新 更多