Jag använder Bluebird-löften här. Notera hur avsikten med koden är ganska tydlig och att det inte finns någon kapsling.
Låt oss först lova hgetall-anropet och klienten -
var client = Promise.promisifyAll(client);
Låt oss nu skriva koden med löften, .then
istället för en nodåteruppringning och aggregering med .map
. Vad .then
signalerar att en asynkronoperation är klar. .map
tar en mängd saker och mappar dem alla till en asynkronoperation precis som ditt hgetall-anrop.
Notera hur Bluebird lägger till (som standard) en Async
suffix till utlovade metoder.
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
});
};