2017-04-11 5 views
2

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

verschoben

In 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 
}) 
+0

das keine Scoping Problem ist, sein ein asynchroner Rückruf Problem, es gibt viele Beiträge – juvian

+2

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

+0

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

Antwort

0

Installieren Sie die async Bibliothek. (Es ist eine sehr nützliche Bibliothek, und wenn Sie sie nicht benutzen, müssen Sie sie wahrscheinlich neu erfinden). Dann nutzen Sie diesen Code:

async.each(existingThing.sensors, function(element, _cb) { 
    Sensor.findOne({ _id: element._id }, function(err, sensor) {    
     if(sensor) { 
      allSensors.push(sensor); 
     } _cb(); 
    }); 
}, function() { 
    console.log(allSensors); 
    res.send(allSensors); 
}); 
+0

Tolles Dankeschön, ziemlich neu zu JS so vermisse kleine Dinge wie diese .. – LukeAS

+0

@LukeAS Danke. Funktioniert meine Antwort? – MultiplyByZer0

+0

Tatsächlich tut es, Prost – LukeAS

Verwandte Themen