sql >> Database >  >> NoSQL >> Redis

For loop in redis met asynchrone verzoeken van nodejs

Je hebt twee hoofdproblemen.

  1. Uw phoneNumber variabele zal niet zijn wat je wilt dat het is. Dat kan worden opgelost door te veranderen in een .forEach() of .map() iteratie van uw array omdat dat een lokaal functiebereik voor de huidige variabele zal creëren.

  2. U hebt een manier gemaakt om te weten wanneer alle asynchrone bewerkingen zijn voltooid. Er zijn veel dubbele vragen/antwoorden die laten zien hoe dat moet. U wilt waarschijnlijk Promise.all() . gebruiken .

Ik stel deze oplossing voor die gebruik maakt van de beloften die je al hebt:

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

Dit is hoe dit werkt:

  1. Bel contacts.filter(utils.isValidNumber) om de array te filteren op alleen geldige getallen.
  2. Bel .map() om door die gefilterde array te bladeren
  3. return db.client().get(phoneNumber) van de .map() terugbellen om een ​​reeks beloften te maken.
  4. Nadat u de gegevens voor het telefoonnummer heeft ontvangen, voegt u die gegevens toe aan uw aangepaste contactList object (dit is in wezen een neveneffect van de .map() lus.
  5. Gebruik Promise.all() op de geretourneerde reeks beloften om te weten wanneer ze allemaal klaar zijn.
  6. Maak de contactList object dat we hebben opgebouwd, is de oploswaarde van de geretourneerde belofte.
  7. Om het vervolgens aan te roepen, gebruik je gewoon de geretourneerde belofte met .then() om het eindresultaat te krijgen. U hoeft geen callback-argument toe te voegen als u al een belofte heeft dat u gewoon kunt terugkeren.


  1. Converteer string naar ObjectID in MongoDB

  2. Django Selderij krijgt taaktelling

  3. Laravel:hoe de beschikbaarheid van Redis te controleren?

  4. Redis:een lijstresultaat ontleden