Javascript 如何将嵌套承诺与Q链接?我能';我不能让他们按正确的顺序运行

Javascript 如何将嵌套承诺与Q链接?我能';我不能让他们按正确的顺序运行,javascript,node.js,asynchronous,promise,q,Javascript,Node.js,Asynchronous,Promise,Q,我希望能够将方法链接在一起,这些方法本身可能包括链接方法 日志应为“第一、第二、第三”。然而,在实践中,它是“第二、第三、第一” 我知道这段代码有点多余,但我只是想了解Promissions/node是如何执行的。我将如何编写基于承诺的函数,使其自身可以链接在一起 user.increaseReadings(id) .then(function(val) { console.log("second",val); return user.findById(id); })

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

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

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

    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;
}
exports.findById=findById;
函数findById(id){
延迟=Q.延迟();
User.findById(id,函数(err,doc){
如果(错误)返回延迟。拒绝(错误);
延迟。解决(doc);
});
回报。承诺;
}
exports.increaseReads=增加读数;
函数增量读数(id){
延迟=Q.延迟();

findById(id)。然后(函数(doc){您可以将递增读数重写为:

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”方法的匿名函数返回一个承诺

在大多数承诺实现中,如果作为处理程序的结果返回一个承诺,那么在解析返回的承诺之前,链中的下一步将不会执行