2012-07-31 26 views
19

estoy tratando de crear una función que devuelve un objeto con información de una devolución de llamada:Espere devolución de llamada en 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; 
}; 

¿Cómo puedo hacer esto? Se ejecuta la función getLocation devolver valor nulo antes de successful.

Gracias!

+0

Tiene demasiados '}' en 'getLocation'. –

+0

Editado, gracias! – palvarez89

+3

Tiene demasiados 'l''s y muy pocos 's' en' successful' ...;) –

Respuesta

25

Las devoluciones de llamada se utilizan porque la función es asincrónica. La devolución de llamada se ejecuta en algún momento en el futuro.

Por lo tanto, sí getLocation regresa antes de que se active la devolución de llamada. Así es como funcionan los métodos asíncronos.

No puede esperar la devolución de llamada, así no es como funciona. Puede agregar una devolución de llamada al getLocation, que se ejecuta una vez que está hecho.

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

Ahora, en lugar de hacer var x = getLocation() y esperar un valor de retorno, que lo llaman así:

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

¡Es muy interesante! El ejemplo funciona muy bien y es perfecto para mi proyecto. Gracias por ayudarme a aprender javascript. – palvarez89

+0

¡De nada, amigo! Me alegro de poder ayudar :-) –

+0

Tropecé con esta respuesta, estoy tratando de transmitir datos de ubicación usando websockets y esto me estaba molestando. Este es definitivamente un paso en la dirección correcta, ¿hay algo más que deba tener en cuenta, ya que estoy tratando de hacer lo anterior con 'setTimeout' o' setInterval' para enviar datos de ubicación cada 'X' segundos. ¿Es este un enfoque aconsejable? –

20

recomendaría el enfoque en la respuesta de Rocket. Sin embargo, si realmente lo desea, podría desencadenar el resto de su código cuando el getLocation finalice utilizando un objeto diferido jQuery. Esto le dará un control más detallado que el simple uso de las devoluciones proporcionadas por 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

Nunca me he equivocado con 'Deferred', pero esto se ve bastante limpio. +1 –

+18

@Rocket Acabo de empezar a jugar con eso ayer, así que ahora intento que cada pregunta se vea como un clavo para poder usar mi nuevo martillo: P – jbabey

Cuestiones relacionadas