在我的快速路线中,我试图返回我使用Mongoose从MongoDB抓取的元素列表。我基本上是通过项目数组迭代,并使MongoDB调用获得每个项目的参数对象。但是,我在确保在发送响应之前获得所有参数时遇到了麻烦。我试过使用promise,其他异步库函数等,但它们似乎都不起作用。
当前迭代的代码看起来像这样(我已经尝试了很多不同的东西):
exports.findAll = function(req, res){
Flow.find({}, function(err, items) {
console.log(items);
var payload = {}
var params = [];
for (var i=0; i < items.length; i++) {
var count2 = 0;
async.whilst(
function() {
return ((items[i]) && (count2 < items[i].params.length));
},
function(callback) {
Parameter.findById(items[i].params[count2], function(err, out) {
params.push(out);
count2++;
callback();
});
},
function(err) {
console.log(params);
var payload = {
"flows": items,
"params": params
};
res.send(payload);
console.log('success: flows found');
}
);
}
这段代码发送了一个参数没有完全填满的有效负载。
处理这个问题的好方法是什么?老实说,我只是希望这些数据库调用是同步的,但我只是不知道如何使这个工作。
这似乎不是必要的,因为您实际上可以使用 $in
运算符处理第一次查询的所有结果:
Flow.find({},function(err,items) {
var ids = [];
// blocking? yes, but should be minor - do better if there are problems
for ( var i=0; i < items.length; i++ ) {
for ( var n=0; n < items[i].params.length; n++ ) {
ids.push( items[i].params[n] );
}
}
Parameter.find({ "_id": { "$in": ids } },function(err,params) {
res.send({ "flows": items, "params": params });
});
});
所以应该没有理由在异步循环中执行多个查询,或者你的代码似乎缺少循环作为问题的直接原因。