在循环中嵌套异步数据库调用,等到循环完成
问题描述:
我在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()
显示它实际上有内容。
答
如果您的NodeJS版本支持它,或者使用任何Promise库,则可以使用Promise。在这种情况下,您可以将for
循环中的代码包装到某个返回Promise
的函数中,然后将所有这些promise对象都推送到数组中。循环调用后
Promise.all(promisesArray).then(/* Callback function that sends response */)
另一种选择是使用递归代替for
循环的,当你达到停止条件发送请求。但我认为这不是好的选择,因为如果collections
数组很大,则可以超过最大堆栈大小。