Din break
statement er ikke inde i en loops brødtekst. Det er i stedet inde i en funktions krop, nemlig findOne
ring tilbage. For at se dette tydeligere, kan det være nyttigt midlertidigt at bruge en navngivet funktion som din tilbagekaldsbehandler:
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 er ret tydeligt nu, at break
i tilbagekaldsfunktionen er kroppen ikke inde i en løkke! Jeg har også fået tingene til at gå i stykker på andre måder, fordi uniqueNumber
og newUnique
værdier er ikke længere i rækkevidde, men det er en anden sag. :) Det vigtige at se her er, at en funktion introducerer en "hård" grænse i din kode, som kan være svær at se udelukkende baseret på sprogets syntaks. Dette er en af grundene til, at denne tilbagekaldsstil af programmering kan være så vanskelig at få den rigtige.
Faktisk er det meget sværere at gøre dette, end dit oprindelige forsøg på koden ville antyde. Du skal have en måde at sende et successignal op gennem muligvis vilkårlige lag af tilbagekald, mens du gentagne gange ringer til findOne
og analyser resultatet (asynkront).
Du kan muligvis få hjælp til dette ved at bruge den fremragende async
bibliotek, for eksempel https://github.com/caolan/async#wilst
.