Maison  >  Article  >  interface Web  >  Comment gérer la récupération de données asynchrones dans une boucle dans MongoDB ?

Comment gérer la récupération de données asynchrones dans une boucle dans MongoDB ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-09 16:59:02836parcourir

How to Handle Asynchronous Data Retrieval within a Loop in MongoDB?

Problème rencontré : récupération de données asynchrones dans une boucle

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.

Racine du problème

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.

Solution : Embracing Promises

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.

Promesses de mise en œuvre

Pour mettre en œuvre les promesses :

  1. Identifier les fonctions asynchrones : Déterminez quelles fonctions du code sont asynchrones, car elles devront être enveloppées dans des promesses. Dans ce cas, le rappel forEach et Prayer.find sont asynchrones.
  2. Envelopper les fonctions asynchrones : Pour les fonctions qui ne renvoient pas nativement de promesses, créez des wrappers qui le font. Dans ce cas, nous utilisons Q.nbind pour envelopper Prayer.find dans une fonction de retour de promesse.
  3. Fonctions de rappel en chaîne : Utilisez .then pour enchaîner les fonctions de rappel qui seront exécutées lorsque le la promesse est résolue. Dans la fonction de rappel, effectuez toutes les opérations nécessaires et renvoyez le résultat.

Solution finale

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!

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