1

我真的在为 nodejs 中的 Q 模块苦苦挣扎。

这是我下面的代码。它在 runnable.com 上运行良好,但是当我将它放在我的一个控制器方法中(原样)时,它只是一直在等待,我可以告诉它调用了第一个方法。但它只是一直在等待。我究竟做错了什么。我现在已经花了 2 天时间了 :(

var Q = require('q');

function Apple (type) {
    this.type = type;
    this.color = "red";

    this.getInfo = function() {
        console.log(this.color);
        return;
    };
}

var apple = new Apple('macintosh');
apple.color = "reddish";

var stat = Q.ninvoke(apple, 'getInfo').then(function() { console.log(err) });

更新:

将 Q.ninvoke 更改为 Q.invoke 并使用 Q 的 v2.0,这不再可用。我得到错误调用未定义。

改为使用 Q 的 v1.0,现在以下工作正常。

var Q = require('q');

function Apple(type) {
    this.type = type;
    this.color = "red";

    this.getInfo = function() {
        return this.color;
    };
}

var apple = new Apple('macintosh');
apple.color = "reddish";

Q.invoke(apple, 'getInfo')
    .then(function(color) {
        console.log(color);
    })
    .fail(function(err) {
        console.log(err);
    });
4

1 回答 1

1

Q.ninvoke, 需要一个 Node.js 风格的方法。Node.js 风格的方法接受一个回调函数,该函数将在错误或执行结果中被调用。

因此,如果您可以更改getInfo函数以接受回调函数并在必须返回结果时调用它,您的程序将可以工作,就像这样

var Q = require('q');

function Apple(type) {
    this.type = type;
    this.color = "red";

    this.getInfo = function(callback) {
        return callback(null, this.color);
    };
}

var apple = new Apple('macintosh');
apple.color = "reddish";

Q.ninvoke(apple, 'getInfo')
    .then(function(color) {
        console.log(color);
    })
    .fail(function(err) {
        console.error(err);
    });

注意:由于你没有使用 Node.js 风格的方法,你应该使用Q.invoke而不是Q.ninvoke像这样

var Q = require('q');

function Apple(type) {
    this.type = type;
    this.color = "red";

    this.getInfo = function() {
        return this.color;
    };
}

var apple = new Apple('macintosh');
apple.color = "reddish";

Q.invoke(apple, 'getInfo')
    .then(function(color) {
        console.log(color);
    })
    .fail(function(err) {
        console.log(err);
    });
于 2014-03-21T01:41:37.320 回答