如何在完成循环时将总数作为分辨率(总计)返回?
这样做的方法是什么?
function getTotalAttack(minions) {
return new Promise( function (resolve, reject) {
console.log("starting do the totalattack math");
var total = 0;
for(var minion in minions) {
console.log("sending one now");
minions.findOne({ _Id : minion }).then(function(response){
total = total + response.attack;
});
}
console.log("result is " + total);
return resolve(total);
});
}
答案 0 :(得分:1)
您可以使用Promise.all()
function getTotalAttack(minionsIds) {
return new Promise( function (resolve, reject) {
var total = 0,
queries$p=[]
// if you need only to retrieve the documents :
// queries$p = minions.find({_id:{$in:minionsIds}}).exec()
// or if you need an extra instruction in between :
minionsIds.forEach(function(mids) {
console.log("sending one now");
queries$p.push(minions.findById(mids).exec())
});
Promise.all(queries$p)
.then( function(minions) {
minions.forEach(function(minion){
total += minion.attack;
})
console.log("total attack:", total);
return resolve(total)
})
.catch( function(e) {
return resolve(0)
})
;
});
}
来自MDN:
如果其中一个元素被拒绝,则拒绝Promise.all Promise.all快速失败:如果你有四个承诺后解决 超时,并立即拒绝,然后Promise.all拒绝 立即
答案 1 :(得分:1)
如果你正在寻找所有小兵攻击的总和,你也可以在一个聚合中直接用mongo执行它:
minion.aggregate(
[{
$group:{
_id: null,
total:{$sum:"$attack"}
}
}]
).then( etc.. )
答案 2 :(得分:0)
您从
进行另一次异步调用minions.findOne({ _Id : thisminion }).then( function(response){
total = +total + response.attack;
});
你应该一次性拿走所有的ID。 我想你在这里使用mongodb? 使用$ in 然后你不需要for循环。