javascript - Fonksiyon çağrısının web SQL sorgusunu beklemesini sağla
Primecheck fonksiyonu, verilen sayının asal olup olmadığını belirleyerek true veya false döndürmelidir. Sayı asal ise, fonksiyon onu PRIMES tablosuna ekler. Bu, Eratosthenes Eleği algoritmasıdır, ancak henüz tamamlanmamıştır.
function primecheck (number) {
var isprime = true;
if (number%10 == 1 || number%10 == 3 || number%10 == 7 || number%10 == 9) {
db.transaction(function (tx) {
tx.executeSql('SELECT * from Primes', [], function (tx, result) {
for (var i = 1; i < result.rows.length; i++) {
if (number%result.rows.item(i)['prime'] == 0) {
isprime = false;
break;
}
}
if (isprime) {
tx.executeSql('INSERT INTO PRIMES (prime) values (?)', [number]);
}
return isprime;
}, null);
}, null, null);
}
else {
isprime = false;
return isprime;
}
}
Sorun: 1, 3, 7, 9 ile bitmeyen sayıları geçtiğimde, fonksiyon true döndürüyor, bu sorun değil. Ama diğer sayıları geçtiğimde, fonksiyon undefined döndürüyor. Bunun sebebinin fonksiyon çağrısının SQL sorgusunun bitmesini 'beklememesi' olduğunu düşünüyorum, bu yüzden bir tür geri çağırma (callback) fonksiyonu kullanmam gerekiyor. Ama bu işe yaramadı.
Cevap #1
Eğer fonksiyonunuz asenkron işlemler yapıyorsa, bu asenkron işlemlerin sonucuna dayalı bir değer döndüremez. (Bunun sebebi, JavaScript’in tek iş parçacıklı doğası nedeniyle asenkron fonksiyonların mevcut yürütme tamamlanana kadar çalışmamasıdır.) Bunun yerine, fonksiyonunuz, döndürülmesi gereken değeri argüman olarak alan bir callback fonksiyonu beklemelidir.
Şu anda fonksiyonunuzu şöyle çağırıyorsunuz:
var isprime = primecheck(someNum);
// now do something with isprime
Ama bir geri arama kullanmanız gerekir:
primecheck(someNum, function(isprime) {
// now do something with isprime
});
Sadece ikinci bir geri çağırma (callback) argümanı ekleyin ve return kullanmak yerine o geri çağırmayı çağırın:
function primecheck (number, callback) {
var isprime = true;
if (number%10 == 1 || number%10 == 3 || number%10 == 7 || number%10 == 9) {
db.transaction(function (tx) {
tx.executeSql('SELECT * from Primes', [], function (tx, result) {
//....
callback(isprime);
}, null);
}, null, null);
}
else {
isprime = false;
callback(isprime);
}
}
Şimdi, primecheck hiçbir şey döndürmez, ama primecheck'e geçirdiğiniz geri çağırma fonksiyonu, primecheck girdinin asal olup olmadığını belirlediğinde, ilk argümanı olarak isprime ile tetiklenecektir.
