Powyższy kod może nie działać zgodnie z oczekiwaniami. Rozpoczynasz każdy .get()
w kolejności, ale mogą nie oddzwaniać po kolei – więc wyniki mogą być przesyłane w dowolnej kolejności. Jeśli chcesz przesyłać strumieniowo wyniki zamiast gromadzić je w pamięci, musisz użyć .get()
w kolejności.
Myślę, że biblioteka asynchroniczna caolan znacznie to ułatwia. Oto jeden ze sposobów, w jaki możesz go użyć, aby uzyskać każdy element w kolejności (ostrzeżenie, nieprzetestowane):
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(']');
}
});
});
});
Jeśli nie zależy Ci na kolejności, po prostu użyj async.forEach()
zamiast tego.
Jeśli nie masz nic przeciwko zbieraniu wyników i chcesz, aby zwracały się one w sekwencji, możesz użyć async.map()
w ten sposób (ostrzeżenie, również nieprzetestowane):
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(',') + ']');
}
});
});
});