Redis
 sql >> Base de données >  >> NoSQL >> Redis

Comment appeler la fonction après l'achèvement des fonctions asynchrones à l'intérieur de la boucle ?

J'utilise les promesses Bluebird ici. Notez que l'intention du code est plutôt claire et qu'il n'y a pas d'imbrication.

Tout d'abord, promettons l'appel hgetall et le client -

var client = Promise.promisifyAll(client);

Maintenant, écrivons le code avec des promesses, .then au lieu d'un rappel de nœud et d'une agrégation avec .map . Qu'est-ce que .then signale qu'une opération asynchrone est terminée. .map prend un tableau de choses et les mappe toutes à une opération asynchrone, tout comme votre appel hgetall.

Notez comment Bluebird ajoute (par défaut) un Async suffixe aux méthodes promises.

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