2016-11-16 61 views
0

我在MongoDB中使用listCollection方法,并使用find查询每个返回的集合。在循环中嵌套异步数据库调用,等到循环完成

的问题是,我使用循环来构建祝循环完成后response.json返回一个对象,但因为find是异步我停留在盘算如何“等待”,直到每find回调之前完成返回response.json()

var data = {}; 

database.listCollections({name: {$ne: 'system.indexes'}}).toArray(function(err, collections) { 
    if (err) return res.json({}); 

    for(i=0; i<collections.length; i++){ 
     var collection = collections[i].name; 

     database.collection(collection).find(query, limit) 
     .sort({"Date": -1}).toArray(function(err, docs){ 

      if (err) return res.json({ 
      }); 

       /* Do stuff with docs, push stuff to data */ 
     }); 
     /** Console shows blank **/ 
     console.log("Data " + i+ ": " + JSON.stringify(data)); 
    } 
    /** Response is blank.. **/ 
    res.json(data); 
}); 

的问题是,find() s的完成前的for循环返回方式。如何以JS/Node的方式处理此问题?我可以一起解决一个解决方案,但我可能以后遇到类似的问题..

编辑:我确定数据实际上返回并正确处理,因为每个数据查找内的console.log()显示它实际上有内容。

回答

1

如果您的NodeJS版本支持它,或者使用任何Promise库,则可以使用Promise。在这种情况下,您可以将for循环中的代码包装到某个返回Promise的函数中,然后将所有这些promise对象都推送到数组中。循环调用后

Promise.all(promisesArray).then(/* Callback function that sends response */)

另一种选择是使用递归代替for循环的,当你达到停止条件发送请求。但我认为这不是好的选择,因为如果collections数组很大,则可以超过最大堆栈大小。