【问题标题】:chaining promises with q.js使用 q.js 链接承诺
【发布时间】:2013-12-03 04:35:01
【问题描述】:

我试图了解承诺链的工作原理。我正在使用q.js。这就是我正在玩的东西。

var Q = require("q"); // npm install q

// the function Q(value) returns a fulfilled promise with the value... I think.
Q(1).then(Q(2)).then(Q(3)).then(Q(4)).then(function(n) {
    console.log(n);
});

Q(1).then(function(n) {
    return Q(2);
}).then(function(n) {
    return Q(3);
}).then(function(n) {
    return Q(4);
}).then(function(n) {
    console.log("done: " + n);
});

我的问题基本上归结为为什么第一个记录 1 而后一个记录我所期望的并且基本上记录 1 到 4。我希望第一个记录 4 而不是 1 .

我真的只是希望能够拥有一些返回承诺的方法,然后将它们以类似瀑布的方式链接在一起 - 我想我可以使用 async 和瀑布,但只是想知道这是否可以实现 w / 承诺。

【问题讨论】:

  • Q(2) 不是函数。您真正想加入哪些职能?

标签: javascript promise q


【解决方案1】:

我知道 javascript 没有静态类型,但您需要在这里考虑类型。

Q(1);                             // has type Promise[Int]
function (n) { return Q(2); }     // has type Int => Promise[Int]

Q.then 需要第二个。

【讨论】:

    【解决方案2】:

    这是因为then 不期望另一个承诺作为参数。相反,它需要 处理函数、回调 和/或 errback,前者是您在第二个示例中传递的。 Indeed any argument that is not a function is simply ignored.

    From the docs:

    如果您在处理程序中返回一个值,则 outputPromise 将得到满足。

    如果您在处理程序中抛出异常,则 outputPromise 将被拒绝。

    如果您在处理程序中返回一个承诺,则 outputPromise 将“成为”该承诺。能够成为一个新的承诺对于管理延迟、合并结果或从错误中恢复很有用。

    所以是的,链式 Promise 是可以做到的。你在第二个例子中做对了。

    这里人为设计的传递已实现的 Promise 的示例可能使链式 Promise 的工作方式看起来过于冗长,但在实际使用中,您通常链式 Promise 是因为您对它们的返回值感兴趣,例如:

    somethingAsync().then(function (n) {
      return somethingElseAsync(n);
    })
    .then(function (n) {
      return somethingElseAsync(n);
    })
    .then(function (result) {
      // ...
    })
    

    (实际上this反映了async.waterfall。如果您只想按顺序调用一系列异步函数而不考虑它们的结果,您可以使用async.series)

    【讨论】:

      猜你喜欢
      • 2016-11-06
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 2015-07-08
      • 1970-01-01
      • 2015-04-15
      • 2023-01-27
      相关资源
      最近更新 更多