【问题标题】:Q async library with node.js waitingQ异步库与node.js等待
【发布时间】:2014-04-28 05:14:34
【问题描述】:

我真的在 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);
    });

【问题讨论】:

  • 实际上,无论哪种情况,它都不会执行 then 块!请帮忙
  • 直接来自 the docs,强调我的:"ninvoke 使用给定的可变参数调用 Node.js 样式的方法,返回一个承诺如果方法返回一个结果,则满足,或者如果它返回一个错误,则被拒绝。” - 你的getInfo() 两者都没有,所以当然这永远行不通。
  • @Tomalak getInfo() 是什么意思。
  • 文档中的那句话真的再清楚不过了。我什至在评论中将相关部分加粗。
  • 那么 void 函数将如何工作?

标签: javascript node.js asynchronous q mean-stack


【解决方案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);
    });

【讨论】:

  • 非常感谢!!要么文档不清楚,要么我是一个完整的菜鸟。尽管它已被弃用,但我不得不更改失败。
  • @user3428172 你使用的q是什么版本的?
  • @user3428172 你得到的确切错误是什么?
  • invoke 未定义或类似的东西。我可以看到 github 说 2.0 是实验性的,所以我应该使用 1?
  • @user3428172 请用确切的错误信息编辑问题,这样我才能帮助你:(
猜你喜欢
  • 2014-04-24
  • 2014-02-15
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 2019-01-15
  • 2021-04-25
相关资源
最近更新 更多