如何将嵌套承诺与Q连锁?我可以'Don’我不能让它们按正确的顺序运行
How do I chain nested promises with Q? I can't get them to run in proper order
我希望能够将方法链接在一起,这些方法本身可能包括链接的方法。
日志应为"first,second,third"。然而,在实践中,它表现为"第二、第三、第一"。
我知道这段代码有点多余,但我只是想了解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;
}
您可以这样重写您的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作为处理程序的结果返回,则链中的下一步将不会执行,直到您解析返回的promise为止。
相关文章:
- 不能从angular2中的子组件指定父组件中的数组
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- 转义符不能与innerHTML一起使用
- JSON.parse没有'不能使用Javascript
- JS可以在Chrome中工作,但不能在Firefox中工作
- 砌体不能填补小缺口
- javascript扫雷器floodfill算法不能正常工作
- JavaScript指令不能像我想象的那样工作
- 为什么在这个网站上不能通过JS访问元素
- 如何将嵌套承诺与Q连锁?我可以'Don’我不能让它们按正确的顺序运行
- 为什么我的 JavaScript 不能按顺序执行
- javascript命令可以单独工作,但不能按顺序作为bookmarklet
- 当我简单地改变两个表达式的顺序时,为什么这个for循环不能工作?
- Javascript不能以正确的if-else顺序工作
- 不能使用Angular.js按字母顺序排列下拉列表值
- 所有问题都不能按正确的顺序解决
- 一个关于nodejs回调执行顺序问题的例子,我不能理解
- 为什么角顺序自定义比较器不能工作
- asp.net mvc 4 -刷新后Javascript不能按顺序运行