Maison >interface Web >js tutoriel >Comment gérer les données renvoyées par les requêtes MongoDB asynchrones dans une boucle ?

Comment gérer les données renvoyées par les requêtes MongoDB asynchrones dans une boucle ?

DDD
DDDoriginal
2024-11-09 16:32:021043parcourir

How to Handle Return Data from Asynchronous MongoDB Queries Within a Loop?

Résoudre les données renvoyées par des requêtes asynchrones dans une boucle

Dans les applications de base de données, il est souvent nécessaire d'effectuer plusieurs requêtes en boucle et de renvoyer les résultats agrégés. Lorsque vous utilisez des opérations de base de données asynchrones, il devient crucial de gérer correctement les données renvoyées, en vous assurant que votre code attend que toutes les requêtes soient terminées avant d'envoyer une réponse.

Dans ce scénario, notre code vise à interroger MongoDB pour plusieurs prières. catégories et renvoie un tableau de données contenant les identifiants de catégorie, le nombre de prières et d’autres détails. Cependant, le simple retour à l'intérieur de la boucle conduisait à des valeurs non définies puisque le code n'attendait pas la fin des requêtes asynchrones.

Pour résoudre ce problème, nous pouvons utiliser la bibliothèque Q, qui facilite la gestion des opérations asynchrones. Malheureusement, la méthode find de la bibliothèque MongoDB ne renvoie pas de promesse, nous utilisons donc les assistants d'interface de nœud de Q pour créer un wrapper immédiat autour de celle-ci, garantissant qu'elle renvoie une promesse :

var find = Q.nbind(Prayer.find, Prayer);

Suivre les principes de la promesse manipulation, nous modifions le rappel forEach pour renvoyer les promesses pour chaque requête, puis utilisons Q.all pour attendre que toutes les promesses soient résolues :

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;
    });
}

function getPrayerInCat(data) {
    var promises = data.map(getPrayerCount);
    return Q.all(promises);
}

Cette approche garantit que notre code attend que toutes les requêtes soient terminées avant de revenir les données agrégées, empêchant les valeurs indéfinies. N'oubliez pas que lorsque vous travaillez avec des opérations asynchrones, il est essentiel de respecter les règles de gestion des promesses, de créer des wrappers si nécessaire et d'utiliser des bibliothèques comme Q pour simplifier le processus.

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