Ich habe eine Funktion unten im Back-End meiner Anwendung, und das Ziel ist, alle Sensoren mit einer bestimmten thingID verbunden zurückzugeben.Scoping-Problem mit Objekt-Array in Javascript
ich diese Annäherung wurde jedoch ein neues Array von Bevöl AllSensors, wenn unter
console.log(allSensors);
res.send(allSensors)
angemeldet ist es ein leeres Array []
ich auch, dass einzelne Elemente Sensor beachten sollte log korrekt
Ich habe die
verschobenIn die sensor.findOne Schleife, und es druckt die Elemente richtig aus.
existingThing.sensors.forEach(function (element) {
Sensor.findOne({_id: element._id}, function (err, sensor) {
if(sensor){
// console.log(sensor);
allSensors.push(sensor);
console.log(allSensors); // this works....
}
})
});
Irgendwelche Ideen zu diesem Verhalten? Dank
//get all sensors associated with thingid
app.get('/api/things/:thingid/sensor', function (req, res) {
var allSensors = [];
Thing.findOne({
thingID: req.params.thingid
}, function (err, existingThing) {
if (!existingThing)
return res.status(409).send({
message: 'Thing doesnt exist'
});
if (existingThing.sensors.length < 0)
return res.status(409).send({
message: 'No sensors'
});
existingThing.sensors.forEach(function (element) {
Sensor.findOne({_id: element._id}, function (err, sensor) {
if(sensor){
// console.log(sensor);
allSensors.push(sensor);
}
})
});
})
console.log(allSensors); //empty
res.send(allSensors); //empty
})
das keine Scoping Problem ist, sein ein asynchroner Rückruf Problem, es gibt viele Beiträge – juvian
Mögliches Duplikat zu überprüfen [Warum meine Variable unverändert ist, nachdem ich es innerhalb einer Funktion ändern? - Asynchrone Code-Referenz] (http://stackoverflow.com/questions/23667086/why-is-my-variable-unterned-after-i-modify-it-inside-of-a-function-asynchron) – Andreas
Hier, es ist nicht genug, um sicherzustellen, dass der "forEach" abgeschlossen ist - Sie müssen auch sicherstellen, dass jeder 'findOne' Aufruf auch abgeschlossen wird. Sie werden wahrscheinlich die [async] (https://caolan.github.io/async/) Bibliothek dafür benötigen. – MultiplyByZer0