Javascript Nodejs中的异步添加到阵列 var-veh=[]; app.get('/updateProf',isLoggedIn,函数(req,res){ 对于(变量i=0;i
因此,我正在执行一个get请求,以获取用户拥有的所有车辆并返回其json,刷新后它工作正常,但当我转到页面时,它在初始加载时显示一个空数组,如果我刷新页面,则填充该数组。我认为这个问题与异步有关,但我很难这样想,需要一些关于如何解决这个问题的建议。是的 在返回JSON之前,您必须等待所有回调完成Javascript Nodejs中的异步添加到阵列 var-veh=[]; app.get('/updateProf',isLoggedIn,函数(req,res){ 对于(变量i=0;i,javascript,arrays,node.js,asynchronous,Javascript,Arrays,Node.js,Asynchronous,因此,我正在执行一个get请求,以获取用户拥有的所有车辆并返回其json,刷新后它工作正常,但当我转到页面时,它在初始加载时显示一个空数组,如果我刷新页面,则填充该数组。我认为这个问题与异步有关,但我很难这样想,需要一些关于如何解决这个问题的建议。是的 在返回JSON之前,您必须等待所有回调完成 var veh = []; app.get('/updateProf', isLoggedIn, function(req, res) { for (var i = 0; i <
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;
});
解决方案是记录执行了多少次回调,当所有回调都执行完毕时,可以返回JSON
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;
});
var-veh=[];
app.get('/updateProf',isLoggedIn,函数(req,res){
处理的数量=0;
总计=需求用户本地车辆长度;
对于(变量i=0;i
如果您使用的是最新版本的Mongoose,那么您可以直接使用Mongoose为每个查询返回的承诺
例如,您的查询可以简化为
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;
});
请注意,我使用$in
操作符将循环直接转换为in
条件,该条件获取要比较的内容的数组(在本例中,它是一个ID数组)
then()
函数仅在查询完成时执行。Async是处理此问题的实用程序库
Vehicles.find({ _id: {'$in': req.user.local.vehicles }})
.exec()
.then(function(vehicleArr) {
res.json(vehicleArr);
});
所以这里所做的唯一改变是跟踪处理的number_,在数组的长度等于我们推送的数量之后,我们可以返回json。所以像这样编程的想法是顺序很重要,回调必须被跟踪。非常感谢你,我认为这有助于我编写其他函数!这就是库喜欢的异步抽象。了解它们在幕后是如何工作的很好,但您不希望每次都编写这种代码。这就是为什么你应该使用async,而且Achromes的回答很好,他只点击数据库一次,而不是针对车辆中的每一项。