上記のコードは、期待どおりに機能しない可能性があります。各.get()
を開始します 順番にコールバックしない可能性があります。そのため、結果は任意の順序でストリーミングされる可能性があります。結果をメモリに収集する代わりにストリーミングする場合は、.get()
を実行する必要があります。 順番に。
caolanの非同期ライブラリを使用すると、これがはるかに簡単になると思います。これを使用して各アイテムを順番に取得する方法の1つを次に示します(警告、未テスト):
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(',') + ']');
}
});
});
});