Горният код може да не направи това, което очаквате. Стартирате всеки .get()
последователно, но може да не се обаждат последователно – така че резултатите могат да се излъчват в произволен ред. Ако искате да предавате поточно резултатите, вместо да ги събирате в паметта, трябва да .get()
последователно.
Мисля, че асинхронната библиотека на caolan прави много от това по-лесно. Ето един начин, по който можете да го използвате, за да получите всеки елемент в последователност (предупреждение, нетествано):
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(']');
}
});
});
});
Ако не ви интересува поръчката, просто използвайте async.forEach()
вместо това.
Ако нямате нищо против да съберете резултатите и искате те да се връщат последователно, можете да използвате async.map()
като това (предупреждение, също непроверено):
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(',') + ']');
}
});
});
});