Was ich gerade versuche, ist, alle Playlists mit den darin enthaltenen Songs anzuzeigen. Um das zu tun, suche ich zuerst alle Playlists, dann mache ich ein for, um sie alle zu durchlaufen (in der gleichen Zeit initialisiere ich globalArr und setze die Werte dann wird es als json gesendet, weil es eine API ist) und das Problem ist wenn ich es tue ein weiterer Fund in der Schleife (PlaylistSong.find oder Song.find) gut, da es asynchron ist die Suche wird gemacht, wenn die für vorbei sein wird, und ich werde 0 Ergebnisse haben, weil sie den Wert increment
nehmen werden, wenn er bei seinem sein wird maximal. Ich hörte von async
, ich googelte sogar, aber ich verstehe wirklich nicht, wie man diesen Code durchsetzt, weil es eine Kombination von for Schleifen und async Abfragen ist ...Wie eine for-Anweisung zu machen, warten mehrere mongoose Abfragen?
Danke für Ihre Hilfe.
router.get('/', function(req, res, next) {
Playlist.find(function (err, playlists) {
if (err) return next(err);
/* Loop through every playlists */
var globalArr = [];
for (var increment = 0; increment < playlists.length; ++increment)
{
globalArr[increment] = [];
globalArr[increment]["name"] = playlists[increment].name;
/* Loop through every links between Songs and Playlist */
PlaylistSong.find({idPlaylist: playlists[increment]._id}, function (err, songs) {
if (err) return next(err);
for (var songIncrement = 0; songIncrement < songs.length; ++songIncrement) {
{
console.log("increment"+increment);
globalArr[increment][songIncrement] = [];
/* Getting the actual song by his ID */
Song.find({_id: song.idSong}, function (err, song) {
if (err) return next(err);
globalArr[increment][songIncrement]["name"] = songs[songIncrement].name;
globalArr[increment][songIncrement]["artist"] = songs[songIncrement].artist;
globalArr[increment][songIncrement]["picture"] = songs[songIncrement].picture;
globalArr[increment][songIncrement]["price"] = songs[songIncrement].price;
globalArr[increment][songIncrement]["file"] = songs[songIncrement].file;
globalArr[increment][songIncrement]["difficulty"] = songs[songIncrement].difficulty;
globalArr[increment][songIncrement]["downloaded"] = songs[songIncrement].downloaded;
});
}
}});
}
res.contentType('application/json');
res.send(JSON.stringify(globalArr));
});
});
Immer noch das gleiche Problem, wenn die Funktion increment = 2 aufgerufen wird, während es 0 und dann 1 sein muss (ich habe 2 Playlisten) – Kangoo13
Ich denke, es ist, weil die Schleife fertig ist, bevor die Funktionen ausgeführt werden (defered Ausführung) und Inkrement ist bereits abgeschlossen. Versuchen Sie, das Inkrement in eine lokale Variable zu verschieben und stattdessen diese Variable zu verwenden. Ich werde meine Antwort mit dem bearbeiten, worüber ich rede. – bpursley
OK, ich habe das Codebeispiel aktualisiert und auch ein jsFiddle hinzugefügt, das zeigt, worum es geht. Der Trick besteht darin, einen neuen Gültigkeitsbereich zu erhalten, indem ein IIFI verwendet und eine Iteration in eine lokale Variable i eingefügt wird, so dass sie bei der nächsten Iteration nicht geändert werden kann.Ich habe auch vergessen, den Rückruf auf mein vorheriges Beispiel zu setzen (ich sagte, ich habe es nicht ausgeführt). Aber überprüfe mein Spiel und ich denke, du wirst ein einfaches Beispiel dafür sehen, was ich vorhabe. Ich glaube nicht, dass dies der EINZIGE Weg ist, um das Problem zu lösen, aber es ist ein Weg, es zu lösen. – bpursley