2016-02-18 2 views
0
var count = 0; 
list.forEach(function(entry){ 
    var coll = db.collection(entry); 
    coll.count(function(err,result){ 
     count = count + result; 
    }) 
}) 

function(count){ 
//do something with count 
} 

Я использую собственный драйвер mongoDB на node.js, и проблема в том, что функция, которая должна использовать счет после того, как она сделала, подсчитала все записи в каждой коллекции, запускается до раннего, что очевидно как это асинхронный. Я долго искал решение, но ничего не нашел.Как подождать, когда функция будет выполнена в Node.js?

+1

Я буквально только что сделал это на работе. модуль mongo является асинхронным, поэтому лучшим способом является использование библиотеки обещаний (или собственных обещаний). Я предлагаю bluebird или async –

ответ

1

Вы можете использовать обещание

Promise.all(
    list.map(function(entry){ 
     return new Promise(function(resolve, reject) { 
      db.collection(entry).count(function(err, result){ 
       if (err) return reject(err); 
       resolve(result); 
      }); 
     }); 
    }) 
).then(count); 

function count(result) { 
    var sum = result.reduce(function(a,b) { return a + b }); 
}