2016-09-01 2 views
2

как я могу вернуть итоговое значение в качестве решения (всего), когда цикл завершен?ответ узла/mongo после цикла

Каким будет способ?

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

ответ

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 отклоняет немедленно.

+0

Как бы Запрос, когда каждый из данных на входе это _id внутри? Как и мой запрос кода? – maria

+0

Я обновил ответ соответственно – Flint

+0

в var minion результат 0 – maria

0

вы сделаете еще один звонок от асинхронной

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

вы должны принять все идентификаторы в одно время. Я думаю, вы используете mongodb здесь? использовать $ в , тогда вам не нужен цикл for.

mongodb $in

1

Если вы ищете сумму всех атак миньонов, вы также можете выполнить его непосредственно с Монго в одной агрегации:

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

Да, но только те, у кого у меня есть ID, будут суммированы – maria

+0

Все из них находятся в дБ, но я хочу только получить сумму тех, которые у меня есть ID в моей переменной – maria

+0

Тогда вам нужно только добавьте '' {$ match: {_id: {$ in: minionsIds}}} '' before '' {$ group: ...} '' – Flint

Смежные вопросы