Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Pętla for w redis z asynchronicznymi żądaniami nodejs

Masz dwa główne problemy.

  1. Twój phoneNumber zmienna nie będzie taka, jak chcesz. Można to naprawić, zmieniając na .forEach() lub .map() iterację tablicy, ponieważ utworzy to lokalny zakres funkcji dla bieżącej zmiennej.

  2. Stworzyłeś sposób, aby wiedzieć, kiedy wszystkie operacje asynchroniczne są wykonane. Istnieje wiele zduplikowanych pytań/odpowiedzi, które pokazują, jak to zrobić. Prawdopodobnie chcesz użyć Promise.all() .

Proponuję to rozwiązanie, które wykorzystuje obietnice, które już masz:

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

Oto jak to działa:

  1. Zadzwoń do contacts.filter(utils.isValidNumber) aby filtrować tablicę tylko do prawidłowych liczb.
  2. Wywołaj .map() iterować przez tę przefiltrowaną tablicę
  3. return db.client().get(phoneNumber) z .map() wywołanie zwrotne, aby utworzyć tablicę obietnic.
  4. Po uzyskaniu danych numeru telefonu dodaj je do niestandardowej contactList obiekt (jest to zasadniczo efekt uboczny .map() pętla.
  5. Użyj Promise.all() na zwróconej tablicy obietnic, aby wiedzieć, kiedy wszystkie zostaną wykonane.
  6. Utwórz contactList obiekt, który zbudowaliśmy, będzie wartością rozwiązania zwróconej obietnicy.
  7. Następnie, aby to wywołać, użyj zwróconej obietnicy z .then() aby uzyskać ostateczny wynik. Nie ma potrzeby dodawania argumentu wywołania zwrotnego, gdy masz już obietnicę, że możesz po prostu zwrócić.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dokładność polecenia redis dbsize

  2. Zapytania zakresowe w Redis — Spring Data Redis

  3. delayed_jobs vs resque vs beanstalkd?

  4. Polecenie Redis, aby uzyskać wszystkie dostępne klucze?

  5. Jak debugować polecenie błędu OOM niedozwolone, gdy używana pamięć> „maxmemory” w Redis?