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

Como chamar a função após a conclusão de funções assíncronas dentro do loop?


Eu uso promessas do Bluebird aqui. Observe como a intenção do código é bastante clara e não há aninhamento.

Primeiro, vamos prometer a chamada hgetall e o cliente -
var client = Promise.promisifyAll(client);

Agora, vamos escrever o código com promessas, .then em vez de um retorno de chamada de nó e agregação com .map . O que .then faz é sinalizar que uma operação assíncrona foi concluída. .map pega uma matriz de coisas e mapeia todas para uma operação assíncrona, assim como sua chamada hgetall.

Observe como o Bluebird adiciona (por padrão) um Async sufixo para 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
    });
};