Вашата break
изразът не е в тялото на цикъл. Вместо това е в тялото на функция, а именно findOne
обратно повикване. За да видите това по-ясно, може да бъде полезно временно да използвате наименувана функция като манипулатор на обратно извикване:
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);
}
});
Вече е доста ясно, че break
в тялото на функцията за обратно извикване не е вътре в цикъл! Също така съм карал нещата да се развалят по други начини, защото uniqueNumber
и newUnique
стойностите вече не са в обхвата, но това е друг проблем. :) Важното, което трябва да видите тук е, че функцията въвежда "твърда" граница във вашия код, която може да бъде трудно да се види въз основа единствено на синтаксиса на езика. Това е една от причините, поради които този стил на обратно извикване на програмиране може да бъде толкова труден за правилен.
Всъщност е много по-трудно да направите това, отколкото би предполагал първоначалният ви опит за кода. Ще трябва да имате начин за предаване на сигнал за успех през евентуално произволни слоеве от обратни извиквания, докато многократно извиквате findOne
и анализирайте резултата (асинхронно).
Може да получите малко помощ с това, като използвате отличния async
библиотека, например https://github.com/caolan/async#whilst
.