2014-09-12 9 views
5

Utilizzo Apache Cordova per sviluppare un'applicazione mobile. il problema è che voglio ottenere il numero di cellulare e quindi inviarlo tramite la funzione jQuery get per l'autorizzazione. tutte le funzioni sono OK ma la funzione che ottiene il numero di cellulare è più lenta di altre e finisce per essere completata.Come far funzionare una funzione javascript dopo che un'altra è terminata?

una sintesi del mio codice è questo:

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

non so il motivo per cui prima di ottenere alert1 e dopo che ho ALERT2. Voglio eseguire i miei altri codici dopo aver ottenuto ALERT2.

Qualsiasi suggerimento sarebbe apprezzato.

+0

è 'telephoneNumber.get()' asincrono? – Satpal

+0

Non so, questo è un plugin: https://gist.github.com/macdonst/4221765 – Salman

risposta

5

Se telephone.get è asincrona, è necessario attendere la fine del processo prima di poter effettuare il primo avviso

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

Scrivi la funzione devicePhoneNumber ad accettare un callback done. Il callback riceve due parametri, err (se presente) e result. Indipendentemente dal telephoneNumber.get, il callback sarà ancora chiamato

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

Per utilizzare la funzione ora, passare funzionare un callback che accetta i due parametri err e result. Nella tua richiamata, controlla l'errore. Se è presente, gestiscilo di conseguenza. È possibile accedere al messaggio di errore con err.message.

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

c'è un modo per mettere "risultato" in una variabile locale? qualcosa come: var PhoneNumber = devicePhoneNumber(); – Salman

+0

'result' è una variabile locale. Cosa intendi? – naomik

+0

qualcosa come: var PhoneNumber = devicePhoneNumber(); – Salman

1

aggiungere una funzione callback alla funzione 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 perché non è convenzionale? hai usato argomenti nella tua funzione di callback, non l'ho fatto - questa è l'unica differenza. e ad esempio un sacco di callback 'jQuery' non usano o non hanno bisogno di argomenti, quindi non penso che sia non convenzionale. –

+0

La tua soluzione è completamente rigida. Ti obbliga a gestire tutti i numeri di telefono allo stesso modo perché "alert" sta accadendo all'interno di "devicePhoneNumber". Utilizzando i parametri, si inverte il controllo e la funzione di chiamata ('onDeviceReady' in questo caso) può gestire le risposte secondo necessità. – naomik

+0

La differenza principale è che l'API può essere utilizzata solo in un modo. La mia API può essere utilizzata in qualsiasi modo. – naomik

Problemi correlati