javascript - usada - ¿Cómo devolver el valor de una función de devolución de llamada asíncrona?
tipos de funciones en javascript (3)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo devuelvo la respuesta de una llamada asíncrona? 31 respuestas
Esta pregunta se hace muchas veces en SO. Pero todavía no puedo conseguir cosas.
Quiero obtener algo de valor de devolución de llamada. Mira la secuencia de comandos a continuación para obtener una aclaración.
function foo(address){
// google map stuff
geocoder.geocode( { ''address'': address}, function(results, status) {
results[0].geometry.location; // I want to return this value
})
}
foo(); //result should be results[0].geometry.location; value
Si intento devolver ese valor simplemente obtengo "indefinido". Seguí algunas ideas de SO, pero aún falla.
Esos son:
function foo(address){
var returnvalue;
geocoder.geocode( { ''address'': address}, function(results, status) {
returnvalue = results[0].geometry.location;
})
return returnvalue;
}
foo(); //still undefined
Esto es imposible ya que no puede regresar de una llamada asíncrona dentro de un método síncrono.
En este caso, debe pasar una devolución de llamada a foo que recibirá el valor de retorno
function foo(address, fn){
geocoder.geocode( { ''address'': address}, function(results, status) {
fn(results[0].geometry.location);
});
}
foo("address", function(location){
alert(location); // this is where you get the return value
});
El problema es que si una llamada de función interna es asíncrona, entonces todas las funciones "envuelven" esta llamada también deben ser asíncronas para "devolver" una respuesta.
Si tiene una gran cantidad de devoluciones de llamada, podría considerar dar el paso y usar una biblioteca de promesas como Q.
No tiene sentido devolver valores de una devolución de llamada. En su lugar, realice el trabajo "foo ()" que desea hacer dentro de su devolución de llamada.
Las devoluciones de llamada asíncronas son invocadas por el navegador o por algún marco como la biblioteca de geocodificación de Google cuando ocurren eventos. No hay lugar para que vayan los valores devueltos. Una función de devolución de llamada puede devolver un valor, en otras palabras, pero el código que llama a la función no prestará atención al valor de retorno.
Si está usando jQuery, le recomendamos que pruebe esto: http://api.jquery.com/category/deferred-object/
Le permite aplazar la ejecución de su función de devolución de llamada hasta que se complete la solicitud ajax (o cualquier operación asíncrona). Esto también se puede usar para llamar a una devolución de llamada una vez que se hayan completado varias solicitudes ajax.