Redis
 sql >> база данни >  >> NoSQL >> Redis

Цикъл за в redis с асинхронни заявки на nodejs

Имате два основни проблема.

  1. Вашият phoneNumber променливата няма да бъде това, което искате да бъде. Това може да се коригира чрез промяна на .forEach() или .map() итерация на вашия масив, защото това ще създаде локален обхват на функцията за текущата променлива.

  2. Създали сте начин да знаете кога всички асинхронни операции са извършени. Има много дублиращи се въпроси/отговори, които показват как да направите това. Вероятно искате да използвате Promise.all() .

Бих предложил това решение, което използва обещанията, които вече имате:

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

Ето как става това:

  1. Обадете се на contacts.filter(utils.isValidNumber) за да филтрирате масива само до валидни числа.
  2. Обадете се на .map() за да преминете през този филтриран масив
  3. return db.client().get(phoneNumber) от .map() обратно извикване, за да създадете масив от обещания.
  4. След като получите данните за телефонния номер, добавете тези данни към своя персонализиран contactList обект (това по същество е страничен ефект от .map() цикъл.
  5. Използвайте Promise.all() върху върнатия масив от обещания, за да разберете кога са готови.
  6. Направете contactList обектът, който изградихме, да бъде стойността на разрешаване на върнатото обещание.
  7. След това, за да го извикате, просто използвайте върнатото обещание с .then() за да получите крайния резултат. Няма нужда да добавяте аргумент за обратно извикване, когато вече имате обещание, което можете просто да върнете.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Използване на Redis за кеширане на SQL резултат

  2. Ruby - Redis базиран мютекс с изпълнение на изтичане

  3. Как да получа стойности от Redis с помощта на ключове, които съдържат интервали?

  4. Съхраняване на стойности на redis hget в променлива в nodejs

  5. Redis с Resque и Rails:командата ERR не е разрешена, когато се използва памет> 'maxmemory'