Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Para loop em redis com solicitações assíncronas de nodejs


Você tem dois problemas principais.

  1. Seu phoneNumber variável não será o que você quer que seja. Isso pode ser corrigido mudando para um .forEach() ou .map() iteração de sua matriz porque isso criará um escopo de função local para a variável atual.

  2. Você criou uma maneira de saber quando todas as operações assíncronas são feitas. Há muitas perguntas/respostas duplicadas que mostram como fazer isso. Você provavelmente quer usar Promise.all() .

Eu sugiro esta solução que aproveita as promessas que você já tem:
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
});

Veja como isso funciona:
  1. Chame contacts.filter(utils.isValidNumber) para filtrar a matriz apenas para números válidos.
  2. Chame .map() para iterar por esse array filtrado
  3. return db.client().get(phoneNumber) do .map() callback para criar uma matriz de promessas.
  4. Depois de obter os dados do número de telefone, adicione esses dados à sua contactList personalizada objeto (este é essencialmente um efeito colateral do .map() laço.
  5. Use Promise.all() na matriz retornada de promessas para saber quando todas elas foram concluídas.
  6. Faça a contactList objeto que construímos seja o valor de resolução da promessa retornada.
  7. Então, para chamá-lo, basta usar a promessa retornada com .then() para obter o resultado final. Não há necessidade de adicionar um argumento de retorno de chamada quando você já tem uma promessa que pode apenas retornar.