Тук използвам обещания на Bluebird. Обърнете внимание как целта на кода е доста ясна и няма вложение.
Първо, нека обещаем повикването hgetall и клиента -
var client = Promise.promisifyAll(client);
Сега, нека напишем кода с обещания, .then
вместо обратно извикване на възел и агрегиране с .map
. Какво .then
do е сигнал, че асинхронната операция е завършена. .map
взема масив от неща и ги съпоставя всички с асинхронна операция, точно като вашето обаждане hgetall.
Обърнете внимание как Bluebird добавя (по подразбиране) Async
суфикс към обещани методи.
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
});
};