Din break
uttalandet är inte inne i en loops brödtext. Det är istället inne i kroppen av en funktion, nämligen findOne
ring tillbaka. För att se detta tydligare kan det vara bra att tillfälligt använda en namngiven funktion som din återuppringningshanterare:
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);
}
});
Det är ganska tydligt nu att break
i återuppringningsfunktionen är kroppen inte inne i en loop! Jag har också fått saker att gå sönder på andra sätt eftersom uniqueNumber
och newUnique
värden är inte längre i omfattning, men det är en annan fråga. :) Det viktiga att se här är att en funktion introducerar en "hård" gräns i din kod som kan vara svår att se utifrån syntaxen i språket. Detta är en av anledningarna till att den här återuppringningsstilen för programmering kan vara så svår att få till rätt.
Faktum är att det är mycket svårare att göra detta än vad ditt ursprungliga försök med koden skulle antyda. Du måste ha ett sätt att skicka en framgångssignal upp genom möjligen godtyckliga lager av återuppringningar när du upprepade gånger ringer findOne
och analysera resultatet (asynkront).
Du kan få lite hjälp med detta genom att använda den utmärkta async
bibliotek, till exempel https://github.com/caolan/async#whilst
.