आपका break
बयान लूप के शरीर के अंदर नहीं है। इसके बजाय, यह फ़ंक्शन के मुख्य भाग के अंदर होता है, अर्थात् findOne
वापस कॉल करें। इसे और स्पष्ट रूप से देखने के लिए, आपके कॉलबैक हैंडलर के रूप में नामित फ़ंक्शन का अस्थायी रूप से उपयोग करना सहायक हो सकता है:
var cb = function(err, data){
if (data.id){
uniqueNumber++;
}
else {
saveLandmark(newUnique);
break; // not inside a loop!
}
};
db.collection('landmarks').findOne({'id':uniqueIDer}, function(err, data){
//if ID exists already
if (data.id){
var uniqueNumber = 1;
while (1) {
var uniqueNum_string = uniqueNumber.toString();
var newUnique = data.id + uniqueNum_string;
db.collection('landmarks').findOne({'id':newUnique}, cb);
}
}
else {
saveLandmark(uniqueIDer);
}
});
अब यह बिल्कुल स्पष्ट है कि break
कॉलबैक फ़ंक्शन में बॉडी लूप के अंदर नहीं है! मैंने चीजों को अन्य तरीकों से भी तोड़ दिया है क्योंकि uniqueNumber
और newUnique
मान अब दायरे में नहीं हैं, लेकिन यह एक अलग मुद्दा है। :) यहां देखने वाली महत्वपूर्ण बात यह है कि एक फ़ंक्शन आपके कोड में एक "हार्ड" सीमा पेश करता है जिसे पूरी तरह से भाषा के सिंटैक्स के आधार पर देखना मुश्किल हो सकता है। यह एक कारण है कि प्रोग्रामिंग की यह कॉलबैक शैली सही होने के लिए इतनी मुश्किल क्यों हो सकती है।
वास्तव में, कोड पर आपके मूल प्रयास की तुलना में ऐसा करना कहीं अधिक कठिन है। जब आप बार-बार findOne
को कॉल करते हैं, तो आपको कॉलबैक की संभावित मनमानी परतों के माध्यम से सफलता संकेत पास करने का एक तरीका होना चाहिए और परिणाम का विश्लेषण करें (एसिंक्रोनस रूप से)।
उत्कृष्ट async
. का उपयोग करके आपको इसमें कुछ सहायता मिल सकती है पुस्तकालय, उदाहरण के लिए https://github.com/caolan/async#whilst
।