Výše uvedený kód nemusí dělat to, co očekáváte. Spouštíte každý .get()
v sekvenci, ale nemusí volat zpět v sekvenci – výsledky by se tedy mohly vysílat v libovolném pořadí. Pokud chcete výsledky streamovat místo shromažďování v paměti, musíte použít .get()
v pořadí.
Myslím, že asynchronní knihovna Caolanu to hodně usnadňuje. Zde je jeden způsob, jak jej použít k získání každé položky v pořadí (varování, netestováno):
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(']');
}
});
});
});
Pokud vám nezáleží na pořadí, použijte async.forEach()
místo toho.
Pokud by vám nevadilo shromažďovat výsledky a chcete, aby se vracely postupně, můžete použít async.map()
takto (varování, také netestováno):
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(',') + ']');
}
});
});
});