循环后的node / mongo响应

时间:2016-09-01 18:55:17

标签: node.js mongodb promise

如何在完成循环时将总数作为分辨率(总计)返回?

这样做的方法是什么?

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

3 个答案:

答案 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循环。

mongodb $in