2016-09-02 39 views
1

我有一个nodejs的异步问题。希望您能够帮助我。nodejs在异步更新数组时遇到问题

exports.DeviceInfo = function(req, res, next) { 
    var nets = req.body.networks; 

    db.collection("device", function(err, deviceConf) { 
    var detected_beacons = []; 

    if (!err) { 
     for (var i = 0; i < nets.length; i++) { 
     deviceConf 
      .find({ 
      "data.number": nets[i] 
      }) 
      .toArray(function(errFind, saver) { 
      if (!errFind && saver) { 
       saver.forEach(function(disp) { 
       var detected = {}; 
       detected.address = disp.address; 
       detected_beacons.push(detected); 
       console.log(detected_beacons); 
       }); 
      } 
      }); 
     } 
     console.log(detected_beacons); 
     res.json(detected_beacons); 
    } else { 
     console.error(err); 
     res.status(500); 
     res.json({ 
     message: "Couldn't connect to database" 
     }); 
    } 
    }); 
}; 

如果我写一些日志,我们可以看到哪个是问题。 detected_beacons在for子句之前返回。我想为之后返回以便充满数据。我已阅读回调和承诺,但我不知道如何在我的代码中使用它们。

image

+0

看看http://stackoverflow.com/q/39288896/18771的评论。你的代码中有完全相同的错误。 – Tomalak

+0

我已经改变for for循环,但同样的问题。 – aserrin55

+0

没有错误出现,但结果相同。 @Tomalak – aserrin55

回答

1

试试看看这个代码。你不能做一个有关回调函数的for循环。

exports.DeviceInfo= function(req,res,next){ 
var nets = req.body.networks; 
db.collection("device", function(err, deviceConf){ 
    var detected_beacons = []; 
    var netSize = nets.length; 
    var beaconsLoop = function(i) { 
     deviceConf.find({"data.number" : nets[i]}).toArray(function(errFind, saver){ 
       if (!errFind && saver){ 
        var saverSize = saver.length; 
        saver.forEach(function(disp){ 
         var detected = {}; 
         detected.address = disp.address; 
         detected_beacons.push(detected); 
         saverSize--; 
         if (saverSize == 0) { 
          if (i != netSize - 1) { 
           i++; 
           beaconsLoop(i); 
          } else { 
           res.json(detected_beacons); 
          } 
         } 
        }); 
       } 
      }); 
    }; 

    if (!err){ 
     if (netSize > 0) beaconsLoop(0); 
    } else { 
     console.error(err); 
     res.status(500); 
     res.json({message:"Couldn't connect to database"}); 
    } 
}); 

};

+0

如果保存程序为空,则有一个选项不会被考虑。纠正那个重复的if(i!= netSize - 1)i ++;beaconsLoop(i); } else { res.json(detected_beacons); }'。你的解决方案太棒了。谢谢! – aserrin55

0

我做了使用map一个简单的解决方案:

if (!errFind && saver) { 
    var detected_beacons = saver.map(function(disp) { 
    return { 
     address: disp.address 
    }; 
    }); 

    console.log(detected_beacons); 
    res.json(detected_beacons); 
} 

这里充满code

+0

这也是有效的,但它不能解决异步问题@Nie,detected_beacons继续首先发送并为空。 – aserrin55