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

devolver valor

Estas en el tema de devolver valor en el foro de Frameworks JS en Foros del Web. Hola tengo el siguiente codigo javascript que hace una llamada AJAX var valor; //Es una variable global function DevolverValor(param){ reqString = newXMLHttpRequest(); var url = ...
  #1 (permalink)  
Antiguo 23/03/2009, 07:31
 
Fecha de Ingreso: enero-2009
Mensajes: 148
Antigüedad: 15 años, 10 meses
Puntos: 0
devolver valor

Hola tengo el siguiente codigo javascript que hace una llamada AJAX

var valor; //Es una variable global

function DevolverValor(param){

reqString = newXMLHttpRequest();

var url = "/getPreferencias";

reqString.open ('GET', url, true);
reqString.onreadystatechange =function(){

if (reqString.readyState == 4 ){
if (reqString.status == 200){
valor =reqString.responseText;


}
}
};
reqString.send (null);
// Punto de ejecucion *
return valor;

}

Bueno lo que quiero es que la llamada AJAX me devuelva un valor y ese mismo valor devolverlo en javascript.

La cosa es que en IE me funciona pero en Mozilla sale que el valor es indefinido.
Es porque hace el return antes de tener el valor se puede hacer algo para que se detenga la ejecucion en el punto * durante un pequeño tiempo para asi poder tener el valor?
O alguien sabe otra solucion para que tambien funcione en Mozilla?
  #2 (permalink)  
Antiguo 23/03/2009, 09:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: devolver valor

Hola dablin,

Cambia tu petición para que sea sincrona, usando false como tercer parámetro, y en este caso no necesitas onreadystatechange, puedes leer directamente con responseText.

Saludos.
  #3 (permalink)  
Antiguo 23/03/2009, 09:38
 
Fecha de Ingreso: enero-2009
Mensajes: 148
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: devolver valor

Buenas!

He hecho este cambio como tu me dijiste:

Código:
function DevolverValor(param){

reqString = newXMLHttpRequest(); 

var url = "/getPreferencias";

reqString.open ('GET', url, false);


if (reqString.readyState == 4 ){
if (reqString.status == 200){
valor =reqString.responseText;


}
}

reqString.send (null);

return valor;

}
Pero sigue sin funcionar...
  #4 (permalink)  
Antiguo 23/03/2009, 09:58
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 8 meses
Puntos: 839
Respuesta: devolver valor

Es que debes llamar primero al método send() antes de obtener el valor de readyState, status o responseText.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 23/03/2009, 11:29
 
Fecha de Ingreso: enero-2009
Mensajes: 148
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: devolver valor

Mil Gracias :)
David el Grande y GatorV
  #6 (permalink)  
Antiguo 02/04/2009, 05:45
 
Fecha de Ingreso: enero-2009
Mensajes: 148
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: devolver valor

Hola reabro este tema porque hoy me dado cuenta de que no funciona correctamente.!

hice lo que me indicasteis y conseguia que la funcion me devolviese el valor haciendo que AJAX fuera sincrono pero me he dado cuenta que la primera vez que llamo a DevolverValor es ok pero la segunda si he modificado el valor (En el servidor) y lo vuelvo a recuperar llamando a la funcion me devuelve el valor antiguo que tenia...

La verdad que es un poco raro me he dado cuenta que en la segunda llamada nunca entra al servlet porque puse que apareciese un mensaje y solo funciona la primera vez, otra cosa es que en la segunda ejecucion el valor de valor es "" y hasta que no entra al reqString.status== 200 no coge el valor de reqString.responseText (con el contenido de la primera ejecucion) ¿Pero si no entra al servlet como puede asignarle un valor?

Espero que me haya explicado bien y bueno sabeis porque pasa eso?
  #7 (permalink)  
Antiguo 02/04/2009, 09:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: devolver valor

Hola dablin,

Eso suele pasar porque el browser hace cacheo del resultado, te recomiendo agregues un valor random a tu request usando Math.random().

Saludos.
  #8 (permalink)  
Antiguo 03/04/2009, 02:49
 
Fecha de Ingreso: enero-2009
Mensajes: 148
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: devolver valor

pero donde agrego el valor random cuando creo el request en newXMLRequest() o antes de hacer la llamada AJAX....
que se pone simplemente Math.random() como una sentencia o hay que asignarsela a mi variable request...

Cuantas preguntas! jeje pero es que nunca había escuchado hablar de eso.

Un saludo GatorV
  #9 (permalink)  
Antiguo 03/04/2009, 10:08
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 8 meses
Puntos: 839
Respuesta: devolver valor

Al usar el método open. Por ejemplo.
Código javascript:
Ver original
  1. objHttpRequest.open("GET", "pagina.php?rand=" + Math.random(), true);
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #10 (permalink)  
Antiguo 03/04/2009, 10:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: devolver valor

Lo haces al enviar el request por AJAX, por ejemplo:
Código javascript:
Ver original
  1. var url = "/getPreferencias?rand=" + Math.random();

Saludos.
  #11 (permalink)  
Antiguo 03/04/2009, 10:58
 
Fecha de Ingreso: enero-2009
Mensajes: 148
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: devolver valor

okis pero no entiendo muy bien para que sirve..! yo en getPreferencias hago una llamada sincrona a un servidor que le paso un parametro que tiene que buscar y el rand=Math.random() y lo que hace es devolverme un valor segun una variable de sesion y el parametro que le he enviado pero.... para que utilizo el rand..

Es que lo he probado pero no he tenido ningun resultado me sigue devolviendo el primer valor y no entra en el servlet la segunda vez que lo llamo..!

Yo creo que los problemas estan al hacer la llamada asincrona
Código:
reqString.open('GET',url,false);
Pero es que tengo que hacer lo asi no se me ocurre ninguna otra forma...!
  #12 (permalink)  
Antiguo 03/04/2009, 11:57
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 8 meses
Puntos: 839
Respuesta: devolver valor

El número aleatorio sirve para forzar al navegador a realizar una nueva petición en lugar de mostrar lo que está en caché.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #13 (permalink)  
Antiguo 03/04/2009, 12:00
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: devolver valor

Como te comento cuando tu haces /getPreferencias, este te devuelve las preferencias, pero el browser internamente hace un caching de los valores, por lo que en tu siguiente request, te da el valor del cache y no hace la llamada al server.

Para eso es el math.random() para agregar un valor "extra" a tu query, aunque no lo proceses ni nada en el servidor, es solo para que el browser vea que es una petición distinta y haga el request.

Saludos.
  #14 (permalink)  
Antiguo 06/04/2009, 03:35
 
Fecha de Ingreso: enero-2009
Mensajes: 148
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: devolver valor

Gracias me ha quedado muy claro.

Me gustaría felicitaros por el foro y por los moderadores que se preocupan tanto por responder. Enhorabuena :)

Saludos dablin
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 13:42.