2012-07-31 14 views
19

Sto cercando di creare una funzione che restituisce un oggetto con le informazioni di un callback:Attendere la richiamata in javascript

var geoloc; 

var successful = function (position) { 
    geoloc = { 
     longitude: position.coords.longitude, 
     latitude: position.coords.latitude 
    }; 
}; 

var getLocation = function() { 
    navigator.geolocation.getCurrentPosition(successful, function() { 
     alert("fail"); 
    }); 

    return geoloc; 
}; 

Come posso fare questo? La funzione getLocation restituisce un valore nullo prima che venga eseguito successful.

Grazie!

+0

Hai troppe '}' in 'getLocation'. –

+0

Modificato, grazie! – palvarez89

+3

Hai troppi 'l' e troppo pochi' s' in 'riuscito' ...;) –

risposta

25

Le richiamate vengono utilizzate perché la funzione è asincrona. Il callback viene eseguito in un determinato momento nel futuro.

Quindi, sì getLocation restituisce prima che la richiamata venga attivata. Ecco come funzionano i metodi asincroni.

Non si può attendere la richiamata, non è così che funziona. È possibile aggiungere una richiamata a getLocation, che viene eseguita una volta completata.

var getLocation = function(callback){ 
    navigator.geolocation.getCurrentPosition(function(pos){ 
     succesfull(pos); 
     typeof callback === 'function' && callback(geoloc); 
    }, function(){ 
     alert("fail"); 
    }); 
}; 

Ora, invece di fare var x = getLocation() e in attesa di un valore di ritorno, si chiamano in questo modo:

getLocation(function(pos){ 
    console.log(pos.longitude, pos.latitude); 
}); 
+0

È molto interessante! L'esempio funziona alla grande ed è perfetto per il mio progetto. Grazie per avermi aiutato a imparare javascript. – palvarez89

+0

Prego, amico! Sono contento di averti aiutato :-) –

+0

Inciampato su questa risposta, sto provando a trasmettere i dati sulla posizione tramite websocket e questo mi ha fatto inciampare. Questo è sicuramente un passo nella giusta direzione, c'è qualcos'altro di cui dovrei essere consapevole, poiché sto cercando di fare quanto sopra con 'setTimeout' o' setInterval' per inviare i dati sulla posizione ogni 'X' secondi. È un approccio consigliabile? –

20

Vorrei raccomandare l'approccio in risposta Rocket. Tuttavia, se lo si desidera, è possibile attivare il resto del codice quando lo getLocation termina utilizzando un oggetto rinviato jQuery. Ciò ti consentirà un controllo più preciso rispetto all'uso dei callback forniti da getCurrentPosition.

// create a new deferred object 
var deferred = $.Deferred(); 

var success = function (position) { 
    // resolve the deferred with your object as the data 
    deferred.resolve({ 
     longitude: position.coords.longitude, 
     latitude: position.coords.latitude 
    }); 
}; 

var fail = function() { 
    // reject the deferred with an error message 
    deferred.reject('failed!'); 
}; 

var getLocation = function() { 
    navigator.geolocation.getCurrentPosition(success, fail); 

    return deferred.promise(); // return a promise 
}; 

// then you would use it like this: 
getLocation().then(
    function (location) { 
     // success, location is the object you passed to resolve 
    }, 
    function (errorMessage) { 
     // fail, errorMessage is the string you passed to reject 
    }); 
+2

Non ho mai veramente incasinato 'Deferred', ma questo sembra abbastanza pulito. +1 –

+18

@Rocket ho appena iniziato a scherzare ieri, quindi ora sto cercando di far sì che ogni domanda assomigli ad un chiodo, così posso usare il mio nuovo martello: P – jbabey

Problemi correlati