Je break
statement bevindt zich niet in de body van een lus. Het bevindt zich in plaats daarvan in de hoofdtekst van een functie, namelijk de findOne
terugbellen. Om dit duidelijker te zien, kan het handig zijn om tijdelijk een benoemde functie te gebruiken als uw callback-handler:
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);
}
});
Het is nu vrij duidelijk dat de break
in de callback-functie bevindt het lichaam zich niet in een lus! Ik heb dingen ook op andere manieren laten breken omdat het uniqueNumber
en newUnique
waarden vallen niet meer onder het bereik, maar dat is een ander probleem. :) Het belangrijkste om hier te zien is dat een functie een "harde" grens in uw code introduceert die moeilijk te zien kan zijn, puur op basis van de syntaxis van de taal. Dit is een van de redenen waarom deze callback-stijl van programmeren zo lastig kan zijn om goed te krijgen.
In feite is het veel moeilijker om dit te doen dan je oorspronkelijke poging tot de code zou impliceren. U moet een manier hebben om een successignaal door mogelijk willekeurige lagen van callbacks door te geven als u herhaaldelijk findOne
belt en analyseer het resultaat (asynchroon).
Je kunt hier misschien wat hulp bij krijgen door de uitstekende async
. te gebruiken bibliotheek, bijvoorbeeld https://github.com/caolan/async#whilst
.