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

Ciclo For in redis con richieste asincrone nodejs

Hai due problemi principali.

  1. Il tuo phoneNumber variabile non sarà quello che vuoi che sia. Questo può essere risolto cambiando in un .forEach() o .map() iterazione dell'array perché ciò creerà un ambito di funzione locale per la variabile corrente.

  2. Hai creato un modo per sapere quando tutte le operazioni asincrone sono state eseguite. Ci sono molte domande/risposte duplicate che mostrano come farlo. Probabilmente vorrai usare Promise.all() .

Suggerirei questa soluzione che fa leva sulle promesse che hai già:

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

Ecco come funziona:

  1. Chiama contacts.filter(utils.isValidNumber) per filtrare l'array solo su numeri validi.
  2. Chiama .map() per scorrere l'array filtrato
  3. return db.client().get(phoneNumber) dal .map() richiamata per creare una serie di promesse.
  4. Dopo aver ottenuto i dati per il numero di telefono, aggiungi tali dati alla tua contactList personalizzata oggetto (questo è essenzialmente un effetto collaterale di .map() ciclo.
  5. Usa Promise.all() sulla matrice restituita di promesse per sapere quando sono tutte completate.
  6. Crea la contactList l'oggetto che abbiamo costruito sia il valore di risoluzione della promessa restituita.
  7. Quindi, per chiamarlo basta usare la promessa restituita con .then() per ottenere il risultato finale. Non c'è bisogno di aggiungere un argomento di callback quando hai già una promessa che puoi semplicemente restituire.