Javascript node.js嵌套回调,获取最终结果数组
我正在执行for循环以从mongodb中查找结果,并对数组进行concat。但是当循环完成时,我不会得到最终的结果数组。我是node.js新手,我认为它不像objective-c回调那样工作Javascript node.js嵌套回调,获取最终结果数组,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在执行for循环以从mongodb中查找结果,并对数组进行concat。但是当循环完成时,我不会得到最终的结果数组。我是node.js新手,我认为它不像objective-c回调那样工作 app.get('/users/self/feed', function(req, res){ var query = Bill.find({user: req.param('userId')}); query.sort('-createdAt'); query.exec(funct
app.get('/users/self/feed', function(req, res){
var query = Bill.find({user: req.param('userId')});
query.sort('-createdAt');
query.exec(function(err, bill){
if (bill) {
var arr = bill;
Following.findOne({user: req.param('userId')}, function(err, follow){
if (follow) {
var follows = follow.following; //this is a array of user ids
for (var i = 0; i < follows.length; i++) {
var followId = follows[i];
Bill.find({user: followId}, function(err, result){
arr = arr.concat(result);
// res.send(200, arr);// this is working.
});
}
} else {
res.send(400, err);
}
});
res.send(200, arr); //if put here, i am not getting the final results
} else {
res.send(400, err);
}
})
});
app.get('/users/self/feed',函数(req,res){
var query=Bill.find({user:req.param('userId')});
sort('-createdAt');
query.exec(函数(错误、账单){
如果(法案){
var arr=票据;
Following.findOne({user:req.param('userId')}),函数(err,follow){
如果(跟随){
var follows=follow.following;//这是一个用户ID数组
对于(var i=0;i
虽然我对MongoDB不太熟悉,但快速阅读一下他们的产品,就会发现他们提供了一个异步Node.js接口
这就是说,findOne
和find
操作都会开始,但不一定在您到达res时完成。send(200,arr)
意味着arr
仍将为空
相反,您应该将响应返回一次all异步调用完成,这意味着您可以执行以下操作:
var billsToFind = follows.length;
for (var i = 0; i < follows.length; i++) {
var followId = follows[i];
Bill.find({user: followId}, function(err, result){
arr = arr.concat(result);
billsToFind -= 1;
if(billsToFind === 0){
res.send(200, arr);
}
});
}
var billsToFind=follows.length;
对于(var i=0;i
该方法对所有内部异步调用使用一个计数器(我忽略了
findOne
,因为我们目前仍然在它的回调中)。当每个Bill.find
调用完成时,它会使计数器递减,一旦达到0,就意味着所有回调都已触发(这是因为Bill.find
是为数组中的每个项调用的后面的),它会用完整数组发回响应。没错。您的for
中的代码将同时并行执行(我想是使用相同的i
值)。如果您在for
循环的内部和之后添加了console.log
,您将发现外部循环将在内部循环之前打印
您可以将for
中的代码包装到函数数组中,并通过并行或串行使用异步
模块()执行它们,然后从异步.parallel
或异步.series
的最后一个参数中检索最终结果