Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    passaggio dati da geolocation

    Ciao a tutti
    Vorrei passare le cordinate da una funzione ad altra ho fatto questo:

    codice:
    function searchGPS() {
        var geoOptions = {
            maximumAge: 5 * 60 * 1000,
            timeout: 10 * 1000
        }
    
    
        var geoSuccess = function(position) {
            var coords = position.coords.latitude + "," + position.coords.longitude;
            return coords;
        }
    
    
        var geoError = function(error) {
            geo_success();
        }
    
    
        if (navigator.geolocation) navigator.geolocation.getCurrentPosition(geoSuccess, geoError, geoOptions);
    }
    
    function distancematrix(func) {
        let coords = searchGPS();
    
    
        alert(coords);
    }
    
    distancematrix();
    ma mi da undefined quindi non mi passa il valore di coords come posso risolvere?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Si è tutto preciso quello che hai detto ma come mai anche con Promise mi fa la stessa cosa?

  4. #4
    Cioè se faccio questo:

    codice:
    function distancematrix(func) {
    
    
        let myPromise = new Promise(function(resolve, reject) {
            resolve(searchGPS);
        });
    
    
        myPromise.then(
            result => alert(result)
        );
    }

    mi da come risultato il code javascript della funzione searchGPS e non il risultato delle cordinate

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Quote Originariamente inviata da techno Visualizza il messaggio
    Cioè se faccio questo [...]
    mi da come risultato il code javascript della funzione searchGPS e non il risultato delle cordinate
    La funzione resolve() va chiamata passando come primo parametro il valore da restituire, ossia i dati ottenuti dal completamento del processo che richiede tempo e che è rappresentato appunto dalla Promise.

    Tu stai passando come primo parametro la funzione searchGPS, quindi è normale che quella funzione costituisca il valore di ritorno della Promise.

    Se volevi passare il valore restituito dalla funzione searchGPS, allora la devi invocare, quindi vanno messe due parentesi:
    codice:
    resolve(searchGPS());
    Se però la funzione searchGPS() è uguale a quella che hai proposto all'inizio, non funzionerà nulla, in quanto restituiva già essa un valore errato per via della problematica che ti ho descritto in modo approfondito.

    In breve, searchGPS non è corretta e restituisce undefined, quindi se la invochi e restituisci il suo valore di ritorno con una Promise, otterrai ovviamente undefined.

    Credo che qui manchino tantissime basi di programmazione JavaScript che devono essere approfondite prima di costruire architetture un minimo più complesse: non si può correre senza prima camminare.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.