Maison >interface Web >js tutoriel >Comment puis-je renvoyer les données de plusieurs requêtes de base de données dans une boucle en JavaScript ?

Comment puis-je renvoyer les données de plusieurs requêtes de base de données dans une boucle en JavaScript ?

DDD
DDDoriginal
2024-11-14 22:19:02366parcourir

How can I return data from multiple database queries within a loop in JavaScript?

Problème de renvoi de données à partir de plusieurs requêtes de base de données dans une boucle

Lors de l'exécution de plusieurs requêtes de base de données dans une boucle, il est essentiel de gérer les opérations asynchrones correctement pour garantir que toutes les données sont récupérées avant de les renvoyer à votre client.

Dans le code fourni, le La fonction getPrayerInCat exécute plusieurs requêtes MongoDB à l'aide du rappel forEach. Cependant, le code renvoie immédiatement undefined car la fonction n'attend pas la fin des résultats de toutes les requêtes de base de données.

Pour résoudre ce problème, nous devons respecter les principes suivants lorsque nous travaillons avec des promesses :

  1. Chaque fonction asynchrone doit renvoyer une promesse.
  2. Créez des wrappers pour les fonctions qui ne renvoient pas de promesses pour les rendre compatible avec la promesse.
  3. Tout ce qui interagit avec un résultat asynchrone doit aller dans un rappel .then.

En utilisant ces principes, nous pouvons créer une version de la fonction getPrayerCount qui renvoie un promesse :

function getPrayerCount(data2) {
    var id = data2.id;
    return find({prayerCat:id})
    .then(function(prayer) {
        if (!prayer)
            data2.prayersCount = 0;
        else
            data2.prayersCount = prayer.length;
        return data2;
    });
}

Pour gérer plusieurs tâches asynchrones et attendre leur achèvement, nous pouvons utiliser Q.all :

function getPrayerInCat(data) {
    var promises = data.map(getPrayerCount); // don't use forEach
    return Q.all(promises);
}

En renvoyant une promesse de la fonction getPrayerInCat, nous pouvons attendre que toutes les requêtes soient terminées avant de renvoyer les résultats.

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