nodejs在asynchronous更新数组时遇到麻烦

我有一个nodejs的asynchronous问题。 希望您能够帮助我。

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" }); } }); }; 

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

图片

试试这个代码。 你不能做callback函数的循环。

 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"}); } }); 

};

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

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

这是完整的代码 。