Redis
 sql >> Base de données >  >> NoSQL >> Redis

Boucle for dans redis avec des requêtes asynchrones nodejs

Vous avez deux problèmes principaux.

  1. Votre phoneNumber variable ne sera pas ce que vous voudriez qu'elle soit. Cela peut être corrigé en passant à un .forEach() ou .map() itération de votre tableau car cela créera une portée de fonction locale pour la variable actuelle.

  2. Vous avez créé un moyen de savoir quand toutes les opérations asynchrones sont terminées. Il y a beaucoup de questions/réponses en double qui montrent comment faire cela. Vous voulez probablement utiliser Promise.all() .

Je suggérerais cette solution qui tire parti des promesses que vous avez déjà :

function getContactList(contacts) {
    var contactList = {};
    return Promise.all(contacts.filter(utils.isValidNumber).map(function(phoneNumber) {
        return db.client().get(phoneNumber).then(function(reply) {
            // build custom object
            constactList[phoneNumber] = reply;
        });
    })).then(function() {
        // make contactList be the resolve value
        return contactList;
    });
}

getContactList.then(function(contactList) {
    // use the contactList here
}, funtion(err) {
    // process errors here
});

Voici comment cela fonctionne :

  1. Appelez contacts.filter(utils.isValidNumber) pour filtrer le tableau uniquement des nombres valides.
  2. Appelez .map() pour parcourir ce tableau filtré
  3. return db.client().get(phoneNumber) depuis le .map() rappel pour créer un tableau de promesses.
  4. Après avoir obtenu les données du numéro de téléphone, ajoutez ces données à votre contactList personnalisée objet (c'est essentiellement un effet secondaire du .map() boucle.
  5. Utilisez Promise.all() sur le tableau de promesses renvoyé pour savoir quand elles sont toutes terminées.
  6. Créer la contactList l'objet que nous avons construit soit la valeur de résolution de la promesse retournée.
  7. Ensuite, pour l'appeler, utilisez simplement la promesse renvoyée avec .then() pour obtenir le résultat final. Pas besoin d'ajouter un argument de rappel lorsque vous avez déjà une promesse que vous pouvez simplement retourner.