La tua break
istruzione non è all'interno del corpo di un ciclo. È, invece, all'interno del corpo di una funzione, ovvero il findOne
richiama. Per vederlo più chiaramente, può essere utile utilizzare temporaneamente una funzione denominata come gestore di richiamata:
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);
}
});
È abbastanza chiaro ora che il break
nel corpo della funzione di callback non è all'interno di un ciclo! Ho anche fatto in modo che le cose si rompessero in altri modi perché il uniqueNumber
e newUnique
i valori non sono più nell'ambito, ma questo è un problema diverso. :) La cosa importante da vedere qui è che una funzione introduce un limite "duro" nel codice che può essere difficile da vedere basato esclusivamente sulla sintassi del linguaggio. Questo è uno dei motivi per cui questo stile di programmazione di callback può essere così difficile da correggere.
In effetti, è molto più difficile farlo di quanto implicherebbe il tuo tentativo originale del codice. Avrai bisogno di un modo per far passare un segnale di successo attraverso livelli possibilmente arbitrari di richiamate mentre chiami ripetutamente findOne
e analizzare il risultato (in modo asincrono).
Potresti ottenere aiuto con questo utilizzando l'eccellente async
libreria, ad esempio https://github.com/caolan/async#whilst
.