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,它在刷新后工作正常,但是当我转到页面时它在初始加载时显示一个空数组,如果我刷新页面,填充数组。我认为问题与异步有关,但我很难以这种方式思考,需要一些如何解决这个问题的建议。
答案 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;
}