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

¿Cómo llamar a la función después de completar las funciones asíncronas dentro del bucle?

Yo uso las promesas de Bluebird aquí. Tenga en cuenta cómo la intención del código es bastante clara y no hay anidamiento.

Primero, prometamos la llamada hgetall y el cliente -

var client = Promise.promisifyAll(client);

Ahora, escribamos el código con promesas, .then en lugar de una devolución de llamada de nodo y agregación con .map . Qué .then lo que hace es indicar que se completó una operación asíncrona. .map toma una variedad de cosas y las asigna todas a una operación asíncrona como su llamada hgetall.

Observe cómo Bluebird agrega (por defecto) un Async sufijo a los métodos prometidos.

exports.awesomeThings = function(req, res) {
    // make initial request, map the array - each element to a result
    return client.lrangeAsync("awesomeThings", 0, -1).map(function(awesomeThing) {
       return client.hgetallAsync("awesomething:" + awesomeThing);
    }).then(function(things){ // all results ready 
         console.log(things); // log them
         res.send(JSON.stringify(things)); // send them
         return things; // so you can use from outside
    });
};