2017-06-15 3 views
1

Gibt es eine Möglichkeit, wie ich Mungo-Funktion innerhalb einer ForEach-Schleife wie dieses Beispiel verwenden kann? Verwendung des Zählers zu machen und erreichen die erreichbare LinieWie kann ich Mungo-Funktionen innerhalb einer for-Schleife verwenden?

idsArray.forEach((itemId,i) =>{ 

     Place.findById(itemId,(err,item)=>{ 
      if(err){ 
       console.log("error") 
      } 
      idsArray[i] = {item.id}; // unreachable 
     }) 
    }) 

ich Async lesen, aber ich konnte den Weg nicht weiß, um es zu erreichen es durch

+0

sollten Sie innerhalb der 'if (error)' Anweisung zurückkehren, das könnte einer der Gründe sein, warum Sie nicht auf item.id zugreifen können. Vielleicht ist die Abfrage fehlgeschlagen, aber da Sie nicht zurückgeben, geht es weiter, auch wenn dort ein Fehler war und das Element nicht definiert oder null ist – nicowernli

Antwort

1

Noch einfacher: die Elemente mit db Versprechen Karte, dann warten für alle:

var promises= idsArray.map((itemId,i) =>{ 
    return new Promise(function(resolve,reject){ 
    Place.findById(itemId,(err,item)=>{ 
     if(err){ 
      return reject(new Error("some")); 
     } 
     resolve(item); 
    }) 
}); 
}); 

Promises.all(promises).then(function(arr){ 
    console.log(arr);//all results 
},function(err){ 
throw err; 
}); 
1

ich denke Jonas w die richtige Antwort, aber ich möchte einige kleinere Abweichungen zeigen, und der Kommentar-Bereich ist nicht sehr nützlich.

var mongoose = require('mongoose'); 
mongoose.Promise = require('bluebird'); // I like bluebird 

// Using exec you get fully-fledged promises from the get-go. 
var promises = idsArray.map(itemId => { 
    return Place.findById(itemId).exec(); 
}); 

Promise.all(promises) 
    .then(arr => { console.log(arr); }) 
    .catch(err => { throw err; }); 
+0

Dies ist eigentlich der bessere Weg. Ich benutze nicht Mungo, also wusste ich nicht von .exec() ... +1 –

Verwandte Themen