Tôi sử dụng lời hứa của Bluebird ở đây. Lưu ý rằng mục đích của mã khá rõ ràng và không có lồng ghép.
Đầu tiên, hãy phân biệt cuộc gọi hgetall và ứng dụng khách -
var client = Promise.promisifyAll(client);
Bây giờ, hãy viết mã với các lời hứa, .then
thay vì gọi lại nút và tổng hợp bằng .map
. What .then
không là báo hiệu một hoạt động không đồng bộ đã hoàn tất. .map
nhận một loạt các thứ và ánh xạ tất cả chúng vào một hoạt động không đồng bộ giống như cuộc gọi hgetall của bạn.
Lưu ý cách Bluebird thêm (theo mặc định) một Async
hậu tố cho các phương thức promisifed.
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
});
};