Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Wie rufe ich die Funktion nach Abschluss der asynchronen Funktionen innerhalb der Schleife auf?

Ich verwende hier Bluebird-Versprechungen. Beachten Sie, dass die Absicht des Codes ziemlich klar ist und es keine Verschachtelung gibt.

Lassen Sie uns zuerst den hgetall-Aufruf und den Client versprechen –

var client = Promise.promisifyAll(client);

Lassen Sie uns nun den Code mit Promises schreiben, .then statt Node-Callback und Aggregation mit .map . Was .then signalisiert, dass ein asynchroner Vorgang abgeschlossen ist. .map Nimmt eine Reihe von Dingen und ordnet sie alle einer asynchronen Operation zu, genau wie Ihr hgetall-Aufruf.

Beachten Sie, wie Bluebird (standardmäßig) einen Async hinzufügt Suffix für versprochene Methoden.

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