Vaše break
příkaz není uvnitř těla smyčky. Místo toho je uvnitř těla funkce, jmenovitě findOne
zpětné volání. Abyste to viděli jasněji, může být užitečné dočasně použít pojmenovanou funkci jako obsluhu zpětného volání:
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);
}
});
Nyní je zcela jasné, že break
v těle funkce zpětného volání není uvnitř smyčky! Kvůli uniqueNumber
jsem také věci pokazil jinými způsoby a newUnique
hodnoty již nejsou v rozsahu, ale to je jiný problém. :) Zde je důležité vidět, že funkce zavádí do vašeho kódu „tvrdou“ hranici, kterou může být obtížné vidět čistě na základě syntaxe jazyka. To je jeden z důvodů, proč může být tento styl zpětného volání tak složitý, aby bylo správné.
Ve skutečnosti je to mnohem obtížnější, než by naznačoval váš původní pokus o kód. Když opakovaně voláte findOne
, budete potřebovat způsob, jak předat signál o úspěchu prostřednictvím možná libovolných vrstev zpětných volání a analyzovat výsledek (asynchronně).
S tím můžete získat pomoc pomocí skvělého async
knihovna, například https://github.com/caolan/async#whilst
.