Dans le code donné, une tentative est faite pour récupérer les données de plusieurs requêtes MongoDB dans une boucle et assembler les résultats dans un seul tableau de données. Cependant, un problème survient lorsque l'on tente de renvoyer ces données en réponse.
Le problème provient de la nature asynchrone des requêtes MongoDB. Lorsqu'une requête est exécutée, la fonction ne renvoie pas immédiatement le résultat mais lance la tâche et renvoie immédiatement. C'est pourquoi finalData, destiné à stocker les résultats agrégés, est renvoyé comme non défini : la fonction se termine avant que les requêtes ne se terminent et ne collectent leurs données.
Pour résoudre ce problème, nous devons tirer parti des promesses, qui facilitent la programmation asynchrone en fournissant un moyen structuré de gérer le flux de tâches asynchrones. Les promesses nous permettent de définir une fonction qui s'exécutera lorsque la tâche asynchrone sera terminée.
Pour mettre en œuvre les promesses :
Avec ces concepts à l'esprit, la fonction getPrayerInCat modifiée est la suivante :
function getPrayerInCat(data) { var promises = data.map(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; }); }); return Q.all(promises); }
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!