2016-09-16 8 views
0

Ich muss viele Objekte in meiner Datenbank mit Mungo speichern. HierMongoose speichern Schleife Iterator verloren

ist ein Beispiel für meinen Code:

for (var i = 0; i < userdata.length; i++) { 

    var newCompany = Company({ 
     name: userdata[i].company_name 
    }); 

    newCompany.save(function(err, c) { 
     if (err) throw err; 

     var newGeoloc = Geolocation({ 
      latitude: userdata[i].latitude, 
      longitude: userdata[i].longitude 
     }); 

     newGeoloc.save(function(err, g) { 
      if (err) throw err; 

     // Create new Office 
     var newOffice = Office({ 
      name  : userdata[i].office_name, 
      address  : userdata[i].address, 
      city  : userdata[i].city, 
      zip_code : userdata[i].zip_code, 
      geolocation : g._id, 
      company  : c._id 
     }); 

     // Save the Office 
     newOffice.save(function(err, officeCreated) { 
      if (err) throw err; 

      console.log('Office created!'); 

     }); 
    }); 
} 

Warum meine i Variable, wenn ich spare das Geolocation-Objekt latitude: datas[i].latitude bekam die maximale Länge meiner Array userdata.length? Wenn z. B. userdata 150 Objekt hat, erhalte ich immer 150, wenn ich das Geolokationsobjekt erstelle.

Wie kann ich tun?

+0

Mögliche Duplikate von [JavaScript-Abschluss in Schleifen - einfaches praktisches Beispiel] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – DAXaholic

+0

Also muss ich nur verwenden Keyword lassen, damit es funktioniert? – John

Antwort

1

Da die for Schleife läuft, ohne abzuwarten, der Rückruf in den save Funktionen empfangen zu werden, Sie Verschlüsse können den Wert von i lokalen bis zur Selbst rufenden Funktion zu halten, wie unten gezeigt.

for (var i = 0; i < userdata.length; i++) { 
    (
     function(index) { 
      var newCompany = Company({ 
       name: userdata[index].company_name 
      }); 

      newCompany.save(function(err, c) { 
       if (err) throw err; 

       var newGeoloc = Geolocation({ 
        latitude: userdata[index].latitude, 
        longitude: userdata[index].longitude 
       }); 

       newGeoloc.save(function(err, g) { 
        if (err) throw err; 
        var newOffice = Office({ 
         name  : userdata[index].office_name, 
         address  : userdata[index].address, 
         city  : userdata[index].city, 
         zip_code : userdata[index].zip_code, 
         geolocation : g._id, 
         company  : c._id 
        }); 

        // Save the Office 
        newOffice.save(function(err, officeCreated) { 
         if (err) throw err; 
         console.log('Office created!'); 
        }); 
       }); 

      }); 
     } 
    )(i); 
} 

Wenn die Selbstaufruffunktion jedes Mal aufgerufen wird, die Schleife ausgeführt wird, wird der Wert von i auf die Variable index kopiert.

+0

Ich muss eine Funktion für jeden Speicher in meiner Schleife erstellen? In meiner Schleife habe ich 4 speichern – John

+0

Ich muss das Unternehmen und Geolocation-Objekt wieder verwenden, um die Objekt-ID in das Office-Objekt einfügen – John

+0

Ich habe den Code bearbeitet, versuchen Sie mit dem modifizierten Code, sollte es ohne Probleme funktionieren –

Verwandte Themen