Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.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 Nodejs中的异步添加到阵列 var-veh=[]; app.get('/updateProf',isLoggedIn,函数(req,res){ 对于(变量i=0;i_Javascript_Arrays_Node.js_Asynchronous - Fatal编程技术网

Javascript Nodejs中的异步添加到阵列 var-veh=[]; app.get('/updateProf',isLoggedIn,函数(req,res){ 对于(变量i=0;i

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 <

因此,我正在执行一个get请求,以获取用户拥有的所有车辆并返回其json,刷新后它工作正常,但当我转到页面时,它在初始加载时显示一个空数组,如果我刷新页面,则填充该数组。我认为这个问题与异步有关,但我很难这样想,需要一些关于如何解决这个问题的建议。

是的

在返回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;
});
解决方案是记录执行了多少次回调,当所有回调都执行完毕时,可以返回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的回答很好,他只点击数据库一次,而不是针对车辆中的每一项。