break
. Anda pernyataan tidak berada di dalam tubuh perulangan. Sebaliknya, di dalam tubuh suatu fungsi, yaitu findOne
panggilan balik Untuk melihat ini lebih jelas, akan sangat membantu untuk sementara menggunakan fungsi bernama sebagai penangan panggilan balik Anda:
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);
}
});
Cukup jelas sekarang bahwa break
di badan fungsi panggilan balik tidak di dalam satu lingkaran! Saya juga membuat masalah dengan cara lain karena uniqueNumber
dan newUnique
nilai tidak lagi dalam ruang lingkup, tapi itu masalah yang berbeda. :) Hal penting untuk dilihat di sini adalah bahwa suatu fungsi memperkenalkan batas "keras" dalam kode Anda yang mungkin sulit dilihat hanya berdasarkan sintaks bahasa. Inilah salah satu alasan mengapa gaya pemrograman callback ini bisa sangat sulit untuk diperbaiki.
Bahkan, jauh lebih sulit untuk melakukan ini daripada upaya awal Anda pada kode yang akan diimplikasikan. Anda harus memiliki cara untuk meneruskan sinyal sukses melalui lapisan panggilan balik yang mungkin berubah-ubah saat Anda berulang kali memanggil findOne
dan analisis hasilnya (secara asinkron).
Anda mungkin mendapatkan bantuan dengan ini dengan menggunakan async
yang luar biasa perpustakaan, misalnya https://github.com/caolan/async#whilst
.