Heim >Web-Frontend >js-Tutorial >Wie handhaben Sie den asynchronen Datenabruf in Schleifen und stellen sicher, dass alle Abfragen abgeschlossen sind, bevor ein zusammenhängender Datensatz zurückgegeben wird?
In vielen Programmierszenarien stoßen wir auf die Notwendigkeit, mehrere asynchrone Datenbanken auszuführen Abfragen in einer Schleife, um Daten abzurufen. Es kann jedoch schwierig sein, die Ergebnisse zu verwalten und sie als einen einzigen zusammenhängenden Datensatz zurückzugeben.
Der in der Frage bereitgestellte Code versucht, die Leistung zu erbringen mehrere MongoDB-Abfragen innerhalb einer Schleife, wobei das Ziel darin besteht, die abgerufenen Daten in einem einzigen Array zu sammeln. Der Code stößt jedoch auf ein Problem, bei dem das Ergebnis als „undefiniert“ zurückgegeben wird, anstatt die erwarteten Daten zu enthalten. Dies liegt daran, dass die „Return“-Anweisung sofort ausgeführt wird, ohne auf den Abschluss aller Abfragen zu warten.
Um dieses Problem anzugehen, müssen wir Folgendes tun Machen Sie sich die Prinzipien der asynchronen Programmierung zu eigen. Zu diesen Prinzipien gehört das Arbeiten mit Versprechen und die ordnungsgemäße Handhabung asynchroner Vorgänge, um sicherzustellen, dass die Ergebnisse nur zurückgegeben werden, wenn alle Abfragen abgeschlossen sind.
Versprechen stellen das letztendliche Ergebnis einer asynchronen Operation dar. Es handelt sich um Objekte, die zwei Rückruffunktionen enthalten: „resolve“ und „reject“. Wenn der Vorgang erfolgreich abgeschlossen wird, wird „resolve“ mit dem Ergebnis aufgerufen, während „reject“ im Fehlerfall aufgerufen wird.
In unserem Szenario sollte jede Datenbankabfrage ein Promise-Objekt zurückgeben. Dadurch können wir eine Kette von Rückrufen erstellen, die nach Abschluss jeder Abfrage nacheinander ausgeführt werden.
Lassen Sie uns den Code umgestalten, um diese Prinzipien zu integrieren :
var getPrayerCount = function(data2) { var id = data2.id; return find({prayerCat:id}) .then(function(prayer) { if (!prayer) data2.prayersCount = 0; else data2.prayersCount = prayer.length; return data2; }); } var getPrayerInCat = function(data) { var promises = data.map(getPrayerCount); return Q.all(promises); }
In „getPrayerCount“ verwenden wir „find“ anstelle von „Prayer.find“, da ersteres ein Versprechen zurückgibt. Anschließend verketten wir einen „.then“-Rückruf, der das Ergebnis jeder Abfrage verarbeitet.
In „getPrayerInCat“ verwenden wir „Q.all“, um ein einzelnes Versprechen zu erstellen, das den Abschluss aller einzelnen Abfragen darstellt . Dadurch wird sichergestellt, dass der Code auf den Abschluss aller Abfragen wartet, bevor er das Ergebnis zurückgibt.
Durch die Befolgung dieser Prinzipien können wir den asynchronen Datenabruf in Schleifen effektiv handhaben und sicherstellen, dass die Ergebnisse letztendlich als zusammenhängender Datensatz zurückgegeben werden Abfragen wurden abgeschlossen.
Das obige ist der detaillierte Inhalt vonWie handhaben Sie den asynchronen Datenabruf in Schleifen und stellen sicher, dass alle Abfragen abgeschlossen sind, bevor ein zusammenhängender Datensatz zurückgegeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!