Redis
 sql >> Database >  >> NoSQL >> Redis

Come chiamare la funzione dopo il completamento delle funzioni asincrone all'interno del ciclo?

Uso le promesse Bluebird qui. Nota come l'intento del codice è piuttosto chiaro e non c'è nidificazione.

Per prima cosa, promettiamo la chiamata hgetall e il client -

var client = Promise.promisifyAll(client);

Ora scriviamo il codice con le promesse, .then invece di una richiamata e aggregazione del nodo con .map . Cosa .then indica che un'operazione asincrona è stata completata. .map prende una serie di cose e le mappa tutte su un'operazione asincrona proprio come la tua chiamata hgetall.

Nota come Bluebird aggiunge (per impostazione predefinita) un Async suffisso ai metodi promessi.

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