Ovanstående kod kanske inte gör vad du förväntar dig. Du sätter igång varje .get()
i sekvens, men de kanske inte ringer tillbaka i ordningsföljd – så resultaten kan strömma ut i vilken ordning som helst. Om du vill streama resultaten istället för att samla dem i minnet måste du .get()
i följd.
Jag tror att caolans async-bibliotek gör mycket av detta enklare. Här är ett sätt du kan använda det för att få varje objekt i sekvens (varning, oprövad):
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(']');
}
});
});
});
Om du inte bryr dig om beställningen, använd bara async.forEach()
istället.
Om du inte skulle ha något emot att samla in resultaten och vill att de ska returneras i sekvens kan du använda async.map()
så här (varning, även oprövat):
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(',') + ']');
}
});
});
});