Đoạn mã trên có thể không làm những gì bạn mong đợi. Bạn đang khởi động từng .get()
theo trình tự, nhưng chúng có thể không gọi lại theo trình tự - vì vậy kết quả có thể truyền ra theo bất kỳ thứ tự nào. Nếu bạn muốn truyền trực tuyến kết quả thay vì thu thập chúng trong bộ nhớ, bạn cần phải .get()
theo trình tự.
Tôi nghĩ rằng thư viện không đồng bộ của caolan làm cho việc này dễ dàng hơn rất nhiều. Đây là một cách bạn có thể sử dụng để sắp xếp từng mục theo trình tự (cảnh báo, chưa được kiểm tra):
app.get("/facility", function(req, res) {
rc.keys("FACILITY*", function(err, replies) {
var i = 0;
res.write("[");
async.forEachSeries(replies, function(reply, callback){
rc.get(reply, function(err, reply) {
if (err){
callback(err);
return;
}
res.write(reply);
if (i < replies.length) {
res.write(",");
}
i++;
callback();
});
}, function(err){
if (err) {
// Handle an error
} else {
res.end(']');
}
});
});
});
Nếu bạn không quan tâm đến đơn đặt hàng, chỉ cần sử dụng async.forEach()
thay vào đó.
Nếu bạn không muốn thu thập kết quả và muốn chúng trả về theo trình tự, bạn có thể sử dụng async.map()
như thế này (cảnh báo, cũng chưa được kiểm tra):
app.get("/facility", function(req, res) {
rc.keys("FACILITY*", function(err, replies) {
async.map(replies, rc.get.bind(rc), function(err, replies){
if (err) {
// Handle an error
} else {
res.end('[' + replies.join(',') + ']');
}
});
});
});