Maison  >  Article  >  interface Web  >  Comment garantir que les requêtes de base de données se terminent avant de renvoyer les résultats en boucle avec MongoDB et Q Promises ?

Comment garantir que les requêtes de base de données se terminent avant de renvoyer les résultats en boucle avec MongoDB et Q Promises ?

DDD
DDDoriginal
2024-11-10 17:34:03948parcourir

How to Ensure Database Queries Finish Before Returning Results in a Loop with MongoDB and Q Promises?

Problème lors du renvoi des résultats récupérés à partir de requêtes de base de données effectuées dans une boucle

Dans cette requête, l'objectif est d'effectuer plusieurs requêtes MongoDB dans un bouclez et envoyez les résultats combinés sous la forme d’un seul tableau de données. Cependant, l'utilisation de return dans la boucle n'attend pas la fin des requêtes de la base de données, ce qui entraîne une réponse indéfinie. Même l'utilisation de Q.moulde ne résout pas le problème.

Code modifié :

var getPrayerInCat = function(data){
    var promises = data.map(function(data2){
        var id = data2.id;
        return Q.nbind(Prayer.find, Prayer)({prayerCat:id})
            .then(function(prayer) {
                if(!prayer) data2.prayersCount = 0;
                else data2.prayersCount = prayer.length;
                return data2;
            })
    });
    return Q.all(promises);
}

Explication :

  1. Q.nbind : Cette fonction convertit la méthode Prayer.find en une fonction qui renvoie une promesse Q.
  2. Promesses de chaîne : Chaque itération de la boucle renvoie désormais une promesse qui se résout avec l'objet de données mis à jour.
  3. Q.all : Cette fonction combine toutes les promesses en une seule promesse qui se résout avec un tableau contenant tous les objets de données mis à jour une fois que toutes les requêtes de base de données ont été terminé.
  4. return Q.all(promises);: Cette ligne garantit que la fonction attend que toutes les requêtes de base de données soient terminées et renvoie le résultat combiné.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn