Maison >interface Web >js tutoriel >Comment gérer la récupération de données asynchrones en boucles et garantir que toutes les requêtes sont terminées avant de renvoyer un ensemble de données cohérent ?
Dans de nombreux scénarios de programmation, nous rencontrons la nécessité d'exécuter plusieurs bases de données asynchrones requêtes en boucle pour récupérer des données. Cependant, il peut être difficile de gérer les résultats et de les renvoyer sous la forme d'un seul ensemble de données cohérent.
Le code fourni dans la question tente d'effectuer plusieurs requêtes MongoDB dans une boucle, où le but est d'accumuler les données récupérées dans un seul tableau. Cependant, le code rencontre un problème où le résultat est renvoyé comme « non défini » au lieu de contenir les données attendues. En effet, l'instruction 'return' est exécutée immédiatement sans attendre la fin de toutes les requêtes.
Pour résoudre ce problème, nous devons adopter les principes de la programmation asynchrone. Ces principes impliquent de travailler avec des promesses et de gérer correctement les opérations asynchrones pour garantir que les résultats ne sont renvoyés que lorsque toutes les requêtes sont terminées.
Promesses représentent le résultat éventuel d’une opération asynchrone. Ce sont des objets qui contiennent deux fonctions de rappel : « résoudre » et « rejeter ». Lorsque l'opération se termine avec succès, « resolve » est appelé avec le résultat, tandis que « reject » est appelé en cas d'échec.
Dans notre scénario, chaque requête de base de données doit renvoyer un objet de promesse. Cela nous permet de créer une chaîne de rappels qui s'exécuteront séquentiellement une fois chaque requête terminée.
Refactorisons le code pour intégrer ces principes :
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); }
Dans 'getPrayerCount', nous utilisons 'find' au lieu de 'Prayer.find' car le premier renvoie une promesse. Nous enchaînons ensuite un rappel '.then' qui traitera le résultat de chaque requête.
Dans 'getPrayerInCat', nous utilisons 'Q.all' pour créer une promesse unique qui représente l'achèvement de toutes les requêtes individuelles. . Cela garantit que le code attendra la fin de toutes les requêtes avant de renvoyer le résultat.
En suivant ces principes, nous pouvons gérer efficacement la récupération de données asynchrones en boucles et garantir que les résultats sont renvoyés sous la forme d'un ensemble de données cohérent lorsque toutes les requêtes sont terminées. les requêtes sont terminées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!