Il problema è lo stesso già discusso in questa sede.
Hai scritto una funzione con chiamate a una operazione asincrona (getCurrentPosition), di cui fornisci una funzione per gestire il callback (geoSuccess): il return che sta dentro a "geoSuccess" è il valore di ritorno della funzione stessa di callback, quindi non può essere il valore di ritorno della funzione searchGPS(), innanzitutto.
In secondo luogo, non è presente nessun return dentro la funzione searchGPS().
In terzo luogo, anche se ci fosse un return, non funzionerebbe: quando esegui getCurrentPosition, avvii una operazione asincrona che - alla sua conclusione - chiamerà "geoSuccess", ma il codice prosegue il percorso ed esce subito dalla funzione searchGPS(), che quindi restituirà sempre undefined.
Non si programma in questo modo in JavaScript: si usano i callback.
Non puoi scrivere i programmi in modo sequenziale: non puoi chiamare getCurrentPosition() e scrivere di seguito qualcosa che si basi sull'esito di questa funzione, perché essa non parla attraverso il valore di ritorno, ma avvia una procedura che gira in background e ritorna subito, mentre la procedura in background continua il suo lavoro e, al termine, userà il callback per segnalare l'esito del lavoro terminato.
Non puoi restituire come valore di ritorno di una funzione quel dato che ottieni dal callback, perché quando la tua funzione viene eseguita, essa avvia solo le procedure in background che ritornano subito, e anche la tua funzione ritornerà subito; il return della funzione di callback che gestisce l'esito successivamente, non può essere il return della funzione che si è già conclusa.
Devi imparare a lavorare con i pattern asincroni previsti da JavaScript, altrimenti incapperai sempre nel medesimo e solito problema.
Se vuoi fare una verifica per capire, metti un console.log() come ultima istruzione di searchGPS() e un altro come ultima istruzione di geoSuccess(): vedrai che il primo viene eseguito prima del secondo, poiché quando il browser esegue getCurrentPosition() prosegue subito la strada ed esegue subito anche l'istruzione successiva, mentre geoSuccess() verrà richiamata dopo, o magari non verrà richiamata affatto, ma l'esecuzione della funzione searchGPS() è già bell'e finita da un pezzo!
Ciao!![]()

Rispondi quotando