在Nodejs中异步添加到数组

时间:2015-06-03 19:22:13

标签: javascript arrays node.js asynchronous

 var veh = [];
 app.get('/updateProf', isLoggedIn, function(req, res) {


     for (var i = 0; i < req.user.local.vehicles.length; i++){
           Vehicles.findById(req.user.local.vehicles[i], function(err, vehicle) {
              veh.push(vehicle);
              console.log("GET Json: " + veh);

            });
     }
     console.log(veh);
     res.json(veh);
     veh.length = 0;
});

所以我正在做一个get请求来获取用户拥有的所有车辆并返回它的json,它在刷新后工作正常,但是当我转到页面时它在初始加载时显示一个空数组,如果我刷新页面,填充数组。我认为问题与异步有关,但我很难以这种方式思考,需要一些如何解决这个问题的建议。

3 个答案:

答案 0 :(得分:3)

是!!

在返回JSON之前,您必须等待所有回调完成。

解决方案是计算已执行的回调次数,以及何时执行了所有回调,您可以返回JSON。

 var veh = [];
 app.get('/updateProf', isLoggedIn, function(req, res) {
 number_processed = 0;
 total = req.user.local.vehicles.length;

 for (var i = 0; i < req.user.local.vehicles.length; i++){
       Vehicles.findById(req.user.local.vehicles[i], function(err, vehicle) {
         if(!err){
             veh.push(vehicle);
         }
         number_processed  = number_processed  + 1;
         if(number_processed === total){
             res.json(veh);
         }
         console.log("GET JSON: " + veh);
      });
 }
 veh.length = 0;
 });

答案 1 :(得分:3)

如果您使用的是更新版本的Mongoose,那么您可以直接使用Mongoose为每个查询返回的Promises

例如,您的查询可以简化为

Vehicles.find({ _id: {'$in': req.user.local.vehicles }})
  .exec()
  .then(function(vehicleArr) {
    res.json(vehicleArr);
  });

请注意,我使用$in运算符直接将您的循环转换为IN条件,该条件采用您想要比较的数组(在这种情况下,它是一个数组ID)

then()函数只在查询完成时执行。

答案 2 :(得分:1)

Async是一个处理此问题的实用程序库。

if (Request.Form["HiddenField1"] != null)
{
    rowIndex = Convert.ToInt16(Request.Form["HiddenField1"].ToString());
    HiddenField1.Value = rowIndex;
}