Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js嵌套回调,获取最终结果数组_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript node.js嵌套回调,获取最终结果数组

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

我正在执行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(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
的最后一个参数中检索最终结果