Twój break
instrukcja nie znajduje się w treści pętli. Zamiast tego znajduje się wewnątrz ciała funkcji, a mianowicie findOne
oddzwonić. Aby lepiej to zobaczyć, pomocne może być tymczasowe użycie nazwanej funkcji jako funkcji obsługi wywołania zwrotnego:
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);
}
});
Teraz jest całkiem jasne, że break
w treści funkcji zwrotnej nie znajduje się w pętli! Sprawiłem też, że rzeczy psują się w inny sposób, ponieważ uniqueNumber
i newUnique
wartości nie są już w zakresie, ale to inny problem. :) Ważną rzeczą do zobaczenia jest to, że funkcja wprowadza „twardą” granicę w twoim kodzie, która może być trudna do zobaczenia na podstawie wyłącznie składni języka. Jest to jeden z powodów, dla których ten styl programowania wywołań zwrotnych może być tak trudny do wykonania.
W rzeczywistości jest to znacznie trudniejsze, niż sugerowałaby to twoja pierwotna próba kodu. Będziesz potrzebował sposobu na przekazywanie sygnału sukcesu przez możliwie dowolne warstwy wywołań zwrotnych, gdy będziesz wielokrotnie wywoływać findOne
i przeanalizuj wynik (asynchronicznie).
Możesz uzyskać w tym pomoc, korzystając z doskonałego async
biblioteka, na przykład https://github.com/caolan/async#whilst
.