Ovenstående kode gør muligvis ikke, hvad du forventer. Du starter hver .get()
i rækkefølge, men de ringer muligvis ikke tilbage i rækkefølge - så resultaterne kan strømme ud i vilkårlig rækkefølge. Hvis du vil streame resultaterne i stedet for at samle dem i hukommelsen, skal du .get()
i rækkefølge.
Jeg tror, at caolans async-bibliotek gør meget af dette nemmere. Her er en måde, hvorpå du kan bruge det til at få hvert element i rækkefølge (advarsel, ikke testet):
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(']');
}
});
});
});
Hvis du er ligeglad med rækkefølgen, skal du bare bruge async.forEach()
i stedet.
Hvis du ikke har noget imod at indsamle resultaterne og vil have dem til at returnere i rækkefølge, kan du bruge async.map()
som denne (advarsel, også utestet):
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(',') + ']');
}
});
});
});