उपरोक्त कोड वह नहीं कर सकता जो आप उम्मीद करते हैं। आप प्रत्येक .get()
. को प्रारंभ कर रहे हैं क्रम में, लेकिन हो सकता है कि वे क्रम से वापस कॉल न करें — ताकि परिणाम किसी भी क्रम में प्रवाहित हो सकें। यदि आप परिणामों को स्मृति में एकत्रित करने के बजाय स्ट्रीम करना चाहते हैं, तो आपको .get()
. की आवश्यकता होगी क्रम में।
मुझे लगता है कि कोलन की एसिंक लाइब्रेरी इसे बहुत आसान बनाती है। प्रत्येक आइटम को क्रम से प्राप्त करने के लिए इसका उपयोग करने का एक तरीका यहां दिया गया है (चेतावनी, परीक्षण नहीं किया गया):
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(',') + ']');
}
});
});
});