sql >> Database teknologi >  >> NoSQL >> Redis

For loop in redis med nodejs asynkrone anmodninger

Du har to hovedproblemer.

  1. Dit phoneNumber variabel vil ikke være, hvad du ønsker, den skal være. Det kan rettes ved at ændre til en .forEach() eller .map() iteration af dit array, fordi det vil skabe et lokalt funktionsområde for den aktuelle variabel.

  2. Du har oprettet en måde at vide, hvornår alle asynkroniseringshandlinger er udført. Der er masser af dobbelte spørgsmål/svar, der viser, hvordan man gør det. Du vil sandsynligvis bruge Promise.all() .

Jeg vil foreslå denne løsning, der udnytter de løfter, du allerede har:

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

Sådan fungerer det:

  1. Ring til contacts.filter(utils.isValidNumber) for at filtrere arrayet til kun gyldige tal.
  2. Ring til .map() at iterere gennem det filtrerede array
  3. return db.client().get(phoneNumber) fra .map() tilbagekald for at skabe en række løfter.
  4. Når du har fået dataene for telefonnummeret, skal du tilføje disse data til din tilpassede contactList objekt (dette er i det væsentlige en bivirkning af .map() sløjfe.
  5. Brug Promise.all() på den returnerede række af løfter om at vide, hvornår de alle er færdige.
  6. Lav contactList objekt, vi har opbygget, være værdien af ​​det returnerede løfte.
  7. For derefter at kalde det, skal du blot bruge det returnerede løfte med .then() for at få det endelige resultat. Ingen grund til at tilføje et tilbagekaldsargument, når du allerede har et løfte om, at du bare kan vende tilbage.


  1. Mongo DB finder alle poster med højeste værdi afhængigt af et nøglefelt

  2. Sådan forskønner du eksporterede MongoDB-dokumenter i mongoexport

  3. Spring Data MongoDB:Fremskrivninger og aggregationer

  4. Sådan forespørges mongodb med DBRef