sql >> Base de Datos >  >> NoSQL >> Redis

For loop en redis con solicitudes asíncronas de nodejs

Tienes dos problemas principales.

  1. Su phoneNumber variable no será lo que usted quiere que sea. Eso se puede arreglar cambiando a .forEach() o .map() iteración de su matriz porque eso creará un alcance de función local para la variable actual.

  2. Ha creado una forma de saber cuándo se realizan todas las operaciones asíncronas. Hay muchas preguntas/respuestas duplicadas que muestran cómo hacerlo. Probablemente quieras usar Promise.all() .

Sugeriría esta solución que aprovecha las promesas que ya tiene:

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

Así es como funciona esto:

  1. Llamar a contacts.filter(utils.isValidNumber) para filtrar la matriz a solo números válidos.
  2. Llamar a .map() para iterar a través de esa matriz filtrada
  3. return db.client().get(phoneNumber) desde el .map() devolución de llamada para crear una serie de promesas.
  4. Después de obtener los datos del número de teléfono, agréguelos a su contactList personalizado. objeto (esto es esencialmente un efecto secundario del .map() bucle.
  5. Utilice Promise.all() en el conjunto de promesas devuelto para saber cuándo se completaron todas.
  6. Haga la contactList el objeto que construimos sea el valor de resolución de la promesa devuelta.
  7. Luego, para llamarlo simplemente use la promesa devuelta con .then() para obtener el resultado final. No es necesario agregar un argumento de devolución de llamada cuando ya tiene una promesa de que puede regresar.