我如何链接与Q的嵌套承诺? 我无法让他们按照正确的顺序运行

我希望能够链接自己可能包括链式方法的方法。

日志应该是“第一,第二,第三”。 但实际上却是“第二,第三,第一”。

我知道这个代码有点多余,但我只是想了解promises / 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; } 

你可以重写你的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。

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