我如何链接与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。
在大多数承诺实现中,如果您作为处理程序的结果返回承诺,那么在解决您返回的承诺之前,链中的下一步将不会执行。