nodejs 异步更新数组时出现问题
nodejs trouble while updating array asynchronously
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 子句之前返回。我想在 for 之后返回 以便充满数据。我读过回调和承诺,但我不知道如何在我的代码中使用它们。
我使用 map
做了一个简单的解决方案:
if (!errFind && saver) {
var detected_beacons = saver.map(function(disp) {
return {
address: disp.address
};
});
console.log(detected_beacons);
res.json(detected_beacons);
}
此处已满code。
试试这个代码。你不能做关于回调函数的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"});
}
});
};
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 子句之前返回。我想在 for 之后返回 以便充满数据。我读过回调和承诺,但我不知道如何在我的代码中使用它们。
我使用 map
做了一个简单的解决方案:
if (!errFind && saver) {
var detected_beacons = saver.map(function(disp) {
return {
address: disp.address
};
});
console.log(detected_beacons);
res.json(detected_beacons);
}
此处已满code。
试试这个代码。你不能做关于回调函数的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"});
}
});
};