Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Funcion devuelve valor demasiado pronto

Estas en el tema de Funcion devuelve valor demasiado pronto en el foro de Frameworks JS en Foros del Web. Hola a todos de nuevo. Me apsa un problemilla que ya me paso hace tiempo tambien pero que esta vez no puedo solucionar, vereis, la ...
  #1 (permalink)  
Antiguo 29/03/2012, 06:08
 
Fecha de Ingreso: mayo-2011
Mensajes: 74
Antigüedad: 12 años, 11 meses
Puntos: 2
Pregunta Funcion devuelve valor demasiado pronto

Hola a todos de nuevo.


Me apsa un problemilla que ya me paso hace tiempo tambien pero que esta vez no puedo solucionar, vereis, la cosa es sencilla, pongamos que tengo un alert(que llama a la funcion getText()

La funcion getText() lo que hace es conectarse asincronamente mediante ajax a un fichero php que le devolvera el texto a mostrar en el alert.

El problema es que getText() devuelve un valor (undefined) antes de que haya recibido la respuesta ajax y por tanto no espera ni aun marcandolo como Async, no encuentro manera de hacer que la funcion getText espere a devolver lo que recibe en el function(msg).

El codigo es el siguiente.


Código:
function getText(type,text)
{
$.ajax({
			type: "POST",
 		  	url: "scripts/php/getxml.php",
   			data: "fichero=strings.xml&type="+type+"&text="+text,
   			success: function(msg)
			{
				return msg;
    		},
    		error: function()
    		{
    		alert("Error de conexion, por favor vuelva a intentarlo.");
    		return false;
    		}
  });
 }
a ver si alguien puede ayudarme.

Un saludo y muchas gracias!
  #2 (permalink)  
Antiguo 29/03/2012, 08:49
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Funcion devuelve valor demasiado pronto

Sería bueno saber como estás llamando esa función

Ejemplo

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>titulo</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6. <script type="text/javascript" src="/jslib/jquery-1.6.1.min.js"></script>
  7. </head>
  8. <p style="cursor: pointer" onclick="getText('honda');">CLICK</p>
  9. <script type="text/javascript">
  10. //<![CDATA[
  11. function getText(modelo){
  12.  
  13. var request = $.ajax({
  14. url: "fa.php",
  15. type: "POST",
  16. data: "modelo=" + modelo
  17. });
  18.  
  19. request.done(function(msg){
  20. alert( "El origen del modelo es: " + msg );
  21. });
  22.  
  23. request.fail(function(jqXHR) {
  24. alert( "Error al procesar: ");
  25. });
  26.  
  27. }
  28. //]]>
  29. </body>
  30. </html>

el fa.php


Código PHP:
Ver original
  1. <?php
  2. if($_POST['modelo'] == 'honda'){
  3. echo "Japones";
  4. }else{
  5. echo "otro";
  6. }
  7. ?>

No uses como parámetro type en la url si type define el método que usas para enviar con ajax
Para forzar un error, corrompé el php, o cambiale la url a la función
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #3 (permalink)  
Antiguo 29/03/2012, 08:56
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Funcion devuelve valor demasiado pronto

me imagino que lo que haces es esto:

alert(getText('type','text'));

y como tu mismo lo has dicho ajax es asincrono por lo que realmente la funcion getText devolverá undefined.

tienes 2 opciones:

1- hacer el AJAX sincrono (poco recomendable) y que el navegador se congele esperando la respuesta.

2- pasar el calllback directamente para recibir la respuesta del server y así emitir el alert:

Código Javascript:
Ver original
  1. function getText(type,text, mycallback)
  2. {
  3. $.ajax({
  4.             type: "POST",
  5.                url: "scripts/php/getxml.php",
  6.                data: "fichero=strings.xml&type="+type+"&text="+text,
  7.                success: mycallback,
  8.             error: function()
  9.             {
  10.             alert("Error de conexion, por favor vuelva a intentarlo.");
  11.             return false;
  12.             }
  13.   });
  14.  }
  15.  
  16. getText('type','text', function (text) {
  17.     alert(text);
  18. })
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #4 (permalink)  
Antiguo 29/03/2012, 11:33
Avatar de DenniX  
Fecha de Ingreso: octubre-2006
Ubicación: Vivo en Lima, Peru
Mensajes: 11
Antigüedad: 17 años, 6 meses
Puntos: 2
Respuesta: Funcion devuelve valor demasiado pronto

Como dice Maykol, es asincrono no puedes capturar el retorno en el momento que quieres, creo que lo mejor es que tu codigo podria quedar asi :

function getText(type,text)
{
$.ajax({
type: "POST",
url: "scripts/php/getxml.php",
data: "fichero=strings.xml&type="+type+"&text="+text ,
success: function(msg)
{
alert( msg);
},
error: function()
{
alert("Error de conexion, por favor vuelva a intentarlo.");
return false;
}
});
}

y supongo que lo estas usando en un evento click de algun enlace o boton.

$("#mi_boton").click(function(){
getText(type, text);
});

Espero te sirva
  #5 (permalink)  
Antiguo 30/03/2012, 01:04
 
Fecha de Ingreso: mayo-2011
Mensajes: 74
Antigüedad: 12 años, 11 meses
Puntos: 2
Respuesta: Funcion devuelve valor demasiado pronto

Hola a todos, Muchas gracias por responder.

El problema estaba en que le ponia sincrono pero al recibir la respuesta hacia la devolucion y por tanto no guardaba nada tampoco, lo logre solucionar poniendo una variable de funcion y modificandola en el success y funciona perfectamente. no podia poner lo del alert como me comentais por que era solo un ejemplo, lo que hace esa funcion es devolver texto directamente y no siempre es tratado como un alert.

Muchas gracias por sus respuestas, tema solucionado. Un saludo!

Etiquetas: ajax, javascript, jquery
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:31.