Maison >interface Web >js tutoriel >Comment gérer la récupération de données asynchrones en boucles et garantir que toutes les requêtes sont terminées avant de renvoyer un ensemble de données cohérent ?

Comment gérer la récupération de données asynchrones en boucles et garantir que toutes les requêtes sont terminées avant de renvoyer un ensemble de données cohérent ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-10 15:54:03524parcourir

How do you handle asynchronous data retrieval in loops and ensure all queries complete before returning a cohesive dataset?

Récupération de données asynchrones dans des boucles : gestion efficace des résultats de requête

Dans de nombreux scénarios de programmation, nous rencontrons la nécessité d'exécuter plusieurs bases de données asynchrones requêtes en boucle pour récupérer des données. Cependant, il peut être difficile de gérer les résultats et de les renvoyer sous la forme d'un seul ensemble de données cohérent.

Description du problème

Le code fourni dans la question tente d'effectuer plusieurs requêtes MongoDB dans une boucle, où le but est d'accumuler les données récupérées dans un seul tableau. Cependant, le code rencontre un problème où le résultat est renvoyé comme « non défini » au lieu de contenir les données attendues. En effet, l'instruction 'return' est exécutée immédiatement sans attendre la fin de toutes les requêtes.

Présentation de la solution

Pour résoudre ce problème, nous devons adopter les principes de la programmation asynchrone. Ces principes impliquent de travailler avec des promesses et de gérer correctement les opérations asynchrones pour garantir que les résultats ne sont renvoyés que lorsque toutes les requêtes sont terminées.

Promesses et fonctions asynchrones

Promesses représentent le résultat éventuel d’une opération asynchrone. Ce sont des objets qui contiennent deux fonctions de rappel : « résoudre » et « rejeter ». Lorsque l'opération se termine avec succès, « resolve » est appelé avec le résultat, tandis que « reject » est appelé en cas d'échec.

Dans notre scénario, chaque requête de base de données doit renvoyer un objet de promesse. Cela nous permet de créer une chaîne de rappels qui s'exécuteront séquentiellement une fois chaque requête terminée.

Refactoring the Code

Refactorisons le code pour intégrer ces principes :

var getPrayerCount = 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;
    });
}

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

Dans 'getPrayerCount', nous utilisons 'find' au lieu de 'Prayer.find' car le premier renvoie une promesse. Nous enchaînons ensuite un rappel '.then' qui traitera le résultat de chaque requête.

Dans 'getPrayerInCat', nous utilisons 'Q.all' pour créer une promesse unique qui représente l'achèvement de toutes les requêtes individuelles. . Cela garantit que le code attendra la fin de toutes les requêtes avant de renvoyer le résultat.

En suivant ces principes, nous pouvons gérer efficacement la récupération de données asynchrones en boucles et garantir que les résultats sont renvoyés sous la forme d'un ensemble de données cohérent lorsque toutes les requêtes sont terminées. les requêtes sont terminées.

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