在nodejs async中设置json数组

时间:2016-12-07 08:58:36

标签: arrays json node.js mongodb

我是nodejs中的新手,我想通过比较循环中的id来创建一个json数组,但MongoDB函数不会等待循环完成,因此数据不能正常输出。它在循环结束前显示数据,下面是代码:

router.get('/getallcountrydataup',function(req, res) {
    Country
        .where('isDeleted').equals(false)
        .exec(function(err,cData){
            if (!cData) {
                res.json({'status':0,'message': 'No data found','data':[]});
            } else{    
                async.waterfall([
                    function (done) {
                        var countryalldata = [];
                        for (var i = 0; i < cData.length; i++) {
                            var country_s = cData[i];
                            State.where('s_c_id').equals(country_s._id)
                                 .exec(function(err, statedata){
                                     country_s.statecount = statedata.length;
                                     //console.log(country_s._id);
                                     console.log(country_s.statecount);
                            });
                            countryalldata.push(country_s);
                        }
                        done(err, countryalldata);
                        //  console.log(countryalldata);
                    },
                    function (countryalldata, done) {
                        console.log(countryalldata);
                        res.json({
                            'status': 1,
                            'message': 'Data found',
                            'data': countryalldata
                        });
                    }
                ]);
            }
        });
    });

这是在循环完成之前打印的countryalldata变量的输出。我想在循环执行完成后打印它的输出。

1 个答案:

答案 0 :(得分:0)

State.where是异步的,因此应该同步。例如async.map

router.get('/getallcountrydataup',function(req, res) {
    Country
      .where('isDeleted').equals(false)
      .exec(function(err,cData){
        if (!cData) {
            res.json({'status':0,'message': 'No data found','data':[]});
        } else {
          async.waterfall([
            function (done) {
              async.map(cData, function (country_s, done2) {
                // Convert country_s into plain object. It's not a mongoose
                // model anymore
                country_s = country_s.toObject();

                State.where('s_c_id')
                .equals(country_s._id)
                .exec(function(err,statedata){
                    if (err) {
                      done2(err);
                      return;
                    }

                    country_s.statecount = statedata.length;
                    console.log(country_s.statecount);

                    done2(null, country_s)
                });
              }, function(err, countryalldata) {
                if (err) {
                  done(err);
                }
                else {
                  done(null, countryalldata)
                }
              });
            },
            function (countryalldata, done) {
              console.log(countryalldata);
              res.json({'status':1,'message': 'Data found','data':countryalldata});
            }
          ]);
        }
    });
});