循环之后的节点/ mongo响应

当循环完成后,我将如何返回总数作为parsing(总数)?

怎么办呢?

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); }); } 

你可以使用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立即拒绝。

如果你正在寻找所有的小兵攻击的总和,你也可以在一个聚合中直接用mongo来执行:

 minion.aggregate( [{ $group:{ _id: null, total:{$sum:"$attack"} } }] ).then( etc.. ) 

你从另一个asynchronous调用

 minions.findOne({ _Id : thisminion }).then( function(response){ total = +total + response.attack; }); 

你应该一次拿走所有的ID。 我想你在这里使用mongodb? 使用$,那么你不需要for循环。

mongodb $ in