【问题标题】:How do I chain nested promises with Q? I can't get them to run in proper order我如何用 Q 链接嵌套的 Promise?我无法让它们以正确的顺序运行
【发布时间】:2025-12-06 10:25:01
【问题描述】:

我希望能够将方法链接在一起,这些方法本身可能包含链接方法。

日志应为“第一、第二、第三”。然而,在实践中,它出现了“第二、第三、第一”。

我知道这段代码有点多余,但我只是想了解 promises/node 是如何执行的。我将如何编写可以链接在一起的基于 Promise 的函数?

    user.increaseReadings(id)
      .then(function(val) { console.log("second",val); return user.findById(id); })
      .then(function(val) { console.log("third",val); res.json(val); });
  }

来自/models/user模块:

exports.findById = findById;
function findById(id)  {
  deferred = Q.defer();

  User.findById(id, function(err, doc) { 
    if (err) return deferred.reject(err);
    deferred.resolve(doc);
  });

  return deferred.promise;
}

exports.increaseReadings = increaseReadings;
function increaseReadings(id) {
  deferred = Q.defer();

  findById(id).then(function(doc) {     <-- here's the problem
    doc.readings++;
    doc.save(function(err, doc) { 
      console.log("first");
      if (err) return deferred.reject(err);
      deferred.resolve(doc);
    });
  });

  return deferred.promise;
}

【问题讨论】:

    标签: javascript node.js asynchronous promise q


    【解决方案1】:

    您可以这样重写您的 increaseReadings:

    function increaseReadings(id) {
        return findById(id).then(function(doc) {
            console.log(doc);
            var deferred = Q.defer();
            doc.readings++;
            doc.save(function(err, doc) { 
                console.log("first");
                if (err) return deferred.reject(err);
                deferred.resolve(doc);
            });
            return deferred.promise;
        });
    }
    

    此代码与您编写的代码之间的重要区别在于,传递给“then”方法的匿名函数返回了一个承诺。

    在大多数 Promise 实现中,如果您将 Promise 作为处理程序的结果返回,则在您解决返回的 Promise 之前,链中的下一步将不会执行。

    【讨论】:

      最近更新 更多