2014-09-12 15 views
5

Używam Apache Cordova do opracowania aplikacji mobilnej. Problem polega na tym, że chcę uzyskać numer telefonu komórkowego, a następnie wysłać go za pośrednictwem funkcji pobierania jQuery do autoryzacji. wszystkie funkcje są w porządku, ale funkcja, która otrzymuje numer telefonu komórkowego, jest wolniejsza od innych i kończy się na końcu.Jak uruchomić funkcję javascript po zakończeniu?

podsumowanie mojego kodu jest taka:

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"); 
    }); 
}; 

Nie wiem, dlaczego najpierw dostać ALERT1 a potem ja dostać ALERT2. Chcę uruchomić moje inne kody po otrzymaniu ALERT2.

Wszelkie sugestie będą mile widziane.

+0

jest 'telephoneNumber.get()' asynchroniczny? – Satpal

+0

Nie wiem, to jest wtyczka: https://gist.github.com/macdonst/4221765 – Salman

Odpowiedz

5

Jeśli telephone.get jest asynchroniczny, trzeba poczekać na zakończenie procesu, zanim będzie można zrobić swój pierwszy wpis

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

Napisz swoją funkcję devicePhoneNumber zaakceptować zwrotnego done. Callback otrzymuje dwa parametry: err (jeśli jest obecny) i result. Niezależnie od telephoneNumber.get, wywołania zwrotnego nadal będzie nazywany

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.")); 
    }); 
} 

Aby wykorzystać funkcję teraz przekazać działać wywołania zwrotnego, które przyjmuje dwa parametry err i result. W swoim oddzwonieniu sprawdź błąd. Jeśli jest obecny, postępuj odpowiednio. Możesz uzyskać dostęp do komunikatu o błędzie za pomocą err.message.

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

czy istnieje sposób na umieszczenie "wyniku" w zmiennej lokalnej? coś takiego: var PhoneNumber = devicePhoneNumber(); – Salman

+0

'wynik' jest zmienną lokalną. Co masz na myśli? – naomik

+0

coś takiego: var PhoneNumber = devicePhoneNumber(); – Salman

1

dodać callback funkcji do funkcji devicePhoneNumber():

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 dlaczego jest niekonwencjonalny? użyłeś argumentów w funkcji zwrotnej, a ja nie - to jedyna różnica. i na przykład wiele callbacków 'jQuery' nie używa argumentów, więc nie sądzę, że jest to nieuczciwe. –

+0

Twoje rozwiązanie jest całkowicie nieelastyczne. Zmusza cię do obsługi wszystkich numerów telefonów w ten sam sposób, ponieważ 'alert' dzieje się w' devicePhoneNumber'. Używając parametrów, odwracasz kontrolę, a funkcja wywołująca ('onDeviceReady' w tym przypadku) może obsłużyć odpowiedzi w razie potrzeby. – naomik

+0

Podstawową różnicą jest to, że interfejs API może być używany tylko w jeden sposób. Mój interfejs API może być w jakikolwiek sposób wykorzystywany. – naomik

Powiązane problemy