Votre break
l'instruction n'est pas à l'intérieur du corps d'une boucle. Il se trouve plutôt à l'intérieur du corps d'une fonction, à savoir findOne
rappeler. Pour voir cela plus clairement, il peut être utile d'utiliser temporairement une fonction nommée comme gestionnaire de rappel :
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);
}
});
Il est assez clair maintenant que le break
dans le corps de la fonction de rappel n'est pas à l'intérieur d'une boucle ! J'ai également fait en sorte que les choses se cassent d'autres manières parce que le uniqueNumber
et newUnique
les valeurs ne sont plus dans la portée, mais c'est un autre problème. :) La chose importante à voir ici est qu'une fonction introduit une limite "dure" dans votre code qui peut être difficile à voir en se basant uniquement sur la syntaxe du langage. C'est l'une des raisons pour lesquelles ce style de programmation par rappel peut être si difficile à maîtriser.
En fait, c'est beaucoup plus difficile à faire que ce que votre tentative initiale de code impliquerait. Vous aurez besoin d'un moyen de transmettre un signal de réussite à travers des couches éventuellement arbitraires de rappels lorsque vous appelez à plusieurs reprises findOne
et analyser le résultat (de manière asynchrone).
Vous pourriez obtenir de l'aide avec cela en utilisant l'excellent async
bibliothèque, par exemple https://github.com/caolan/async#whilst
.