इस कोड में कम से कम दो समस्याएं हैं:
-
पहला जावास्क्रिप्ट क्लोजर मैनेजमेंट से जुड़ा हुआ है। लूप की बॉडी स्कोप नहीं बनाती है। जावास्क्रिप्ट के साथ, चर का दायरा फ़ंक्शन स्तर पर है, ब्लॉक स्तर पर नहीं। उचित बंद के निर्माण को लागू करने के लिए आपको लूप में ही कुछ फ़ंक्शन पेश करने की आवश्यकता है। अधिक जानकारी यहाँ।
-
दूसरा मौजूद और सेट कमांड के बीच दौड़ की स्थिति है। यदि आपके पास कई रेडिस कनेक्शन चल रहे हैं और एक ही कुंजी पर कमांड सेट करते हैं, तो आपके पास कुछ प्रकार के संघर्ष होने की संभावना है। मौजूद और सेट का उपयोग करने के बजाय, आपको सेटएनएक्स का उपयोग करना चाहिए जो एक परमाणु ऑपरेशन में जांच और सेट करता है।
आपके दूसरे उदाहरण को ध्यान में रखते हुए, forEach का उपयोग करके बंद करने की समस्या को ठीक कर दिया गया है, लेकिन आप अभी भी भाषा की अतुल्यकालिक प्रकृति के कारण सेट संचालन से पहले सभी प्राप्त संचालन उत्पन्न करते हैं।
यदि आप वास्तव में अपने सभी प्राप्त और सेट संचालन को अनुक्रमित करना चाहते हैं (जो बहुत धीमी बीटीडब्ल्यू होगी), तो आप रिकर्सन का उपयोग करके लूप को लागू करने के लिए कुछ कार्यात्मक प्रोग्रामिंग का उपयोग कर सकते हैं।
उदाहरण :
यह कार्यक्रम:
var redis = require('redis')
var rc = redis.createClient(6379, 'localhost');
var tags = [
"apple",
"tiger",
"mouse",
"apple",
"apple",
"apple",
"tiger",
"mouse",
"mouse",
];
var count = 0;
function loop(tags) {
function rec_loop(tags,i) {
if ( i >= tags.length )
return
rc.get("tag:"+tags[i],function(err,rr) {
console.log("get tag "+tags[i]+" result code "+rr);
if ( rr == null ) {
rc.set("tag:"+tags[i],"info",function(err,rr) {
count++;
console.log('set tag '+tags[i]+' '+rr+' objects count '+count);
rec_loop(tags,++i)
})
} else
rec_loop(tags,++i)
})
}
rec_loop(tags,0)
}
loop(tags)
प्रदर्शित करता है:
get tag apple result code null
set tag apple OK objects count 1
get tag tiger result code null
set tag tiger OK objects count 2
get tag mouse result code null
set tag mouse OK objects count 3
get tag apple result code info
get tag apple result code info
get tag apple result code info
get tag tiger result code info
get tag mouse result code info
get tag mouse result code info
ध्यान दें कि इस उदाहरण में दौड़ की स्थिति अभी भी मौजूद है। इस प्रकार के चेक और सेट संचालन को लागू करने के लिए आपको setnx का उपयोग करना चाहिए।