2014-09-12 35 views
5

Mobil uygulama geliştirmek için Apache Cordova kullanıyorum. Sorun şu ki cep telefonu numarasını almak ve sonra jQuery yetkilendirme işleviyle göndermek istiyorum. tüm işlevler tamamdır, ancak cep telefonu numarası alan işlev, diğerlerinden daha yavaştır ve bitmiş olur.Başka biri bittikten sonra çalıştırmak için javascript işlevi nasıl oluşturulur?

document.addEventListener("deviceready", onDeviceReady, false); 
function onDeviceReady() { 
    devicePhoneNumber(); 
    alert("ALERT1"); // ALERT1 
}; 
function devicePhoneNumber() { 
    var telephoneNumber = cordova.require("telephonenumber"); 
    telephoneNumber.get(function (result) { 
    alert(result); //ALERT2 
    }, function() { 
     alert("error"); 
    }); 
}; 

ben neden ilk bir ALERT1 olsun bilmiyorum ve bundan sonra i ALERT2 olsun:

benim kod özeti budur. ALERT2'yi aldıktan sonra diğer kodlarımı çalıştırmak istiyorum.

Herhangi bir öneri takdir edilecektir. telephone.get zaman uyumsuz olduğu

+0

'telephoneNumber.get()' asenkron mı? – Satpal

+0

Bilmiyorum, bu bir eklenti: https://gist.github.com/macdonst/4221765 – Salman

cevap

5

Eğer bir geri arama done kabul edecek devicePhoneNumber fonksiyonunu yazın ilk uyarısı

document.addEventListener("deviceready", onDeviceReady, false); 

yapmak için önce o bitmesini beklemek gerekir. Geri arama iki parametre, err (varsa) ve result alır. Ne olursa olsun telephoneNumber.get arasında, geri arama hala iki parametre err ve result kabul eden bir geri arama işlevi, şimdi işlevini kullanın geçmek için

function devicePhoneNumber(done) { 
    var telephoneNumber = cordova.require("telephonenumber"); 
    telephoneNumber.get(function (result) { 
    done(null, result); 
    }, function() { 
    done(Error("There was an error getting the phone number.")); 
    }); 
} 

çağrılır. Geri aramada, hatayı kontrol edin. Varsa, buna uygun şekilde kullanın. Hata mesajına err.message ile erişebilirsiniz.

function onDeviceReady() { 
    devicePhoneNumber(function(err, result) { 
    if (err) return alert(err.message); 
    alert("Alert 1"); // alert 1 
    alert(result);  // alert 2 
    }); 
} 
+0

Yerel bir değişkene "sonuç" koymanın herhangi bir yolu var mı? gibi bir şey: var PhoneNumber = devicePhoneNumber(); – Salman

+0

'result' yerel bir değişkendir. Ne demek istiyorsun? – naomik

+0

gibi bir şey var: var PhoneNumber = devicePhoneNumber(); – Salman

1

sizin devicePhoneNumber() işleve bir callback işlevi ekleyin:

document.addEventListener("deviceready", onDeviceReady, false); 
function onDeviceReady() { 
    devicePhoneNumber(function(){ //anonymous function for the callback parameter 
     /* everything you put in here will be executed only AFTER 
     telephoneNumber.get() has run successfully */ 
     alert("ALERT1"); // ALERT1 
    }); 

}; 
function devicePhoneNumber(callback) { 
    var telephoneNumber = cordova.require("telephonenumber"); 
    telephoneNumber.get(function (result) { 
    alert(result); //ALERT2 
    callback(); //callback function is called here 
    }, function() { 
     alert("error"); 
    }); 
}; 
+0

@naomik neden sıra dışı? Geriçağırım fonksiyonunda argümanlar kullandın, ben yapmadım - bu tek fark. ve örneğin bir çok “jQuery” geri çağrısı argümanlara ihtiyaç duymaz ya da buna ihtiyaç duymaz, bu yüzden bu konunun geleneksel olmadığını düşünüyorum. –

+0

Çözümünüz tamamen esnek değil. Bu, tüm telefon numaralarını aynı şekilde ele almanızı zorlaştırır çünkü 'alert', 'devicePhoneNumber' içinde gerçekleşir. Parametreleri kullanarak, kontrolü tersine çevirirsiniz ve çağıran işlev (bu durumda onDeviceReady), yanıtları gerektiği gibi işleyebilir. – naomik

+0

Birincil fark, API'niz yalnızca bir şekilde kullanılabilir. Benim API'm herhangi bir şekilde kullanılabilir. – naomik

İlgili konular