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

AJAX: devolver el valor de la respuesta

Estas en el tema de AJAX: devolver el valor de la respuesta en el foro de Frameworks JS en Foros del Web. Hola, estoy empezando con AJAX y no encuentro la manera (sin librerías del estilo de jQuery y demás) de hacer una función que devuelva el ...
  #1 (permalink)  
Antiguo 23/03/2009, 19:53
isra00
Invitado
 
Mensajes: n/a
Puntos:
Pregunta AJAX: devolver el valor de la respuesta

Hola, estoy empezando con AJAX y no encuentro la manera (sin librerías del estilo de jQuery y demás) de hacer una función que devuelva el contenido de la petición. Con la siguiente función puedo hacer peticiones y realizar operaciones con la salida:

Código:
//Carga un script y su respuesta en texto o xml, y ejecuta la función especificada como parámetro
//La función funcion_trigger debe tener un parámetro que tomará el valor de la respuesta
function ajax(url, xml, funcion_trigger) {
	//Construye un manejador AJAX adecuado al navegador
	var req;
	variable_global = "segundo valor";
	try {
		// Opera 8.0+, Firefox, WebKit
		req = new XMLHttpRequest();
	} catch (e) {
		// Internet Explorer
		try{
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try{
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e){
				alert("Navegador no compatible con AJAX!");
				return false;
			}
		}
	}

	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			if (req.status == "200") {
				var respuesta;
				respuesta = (xml) ? req.responseXml:req.responseText;
				funcion_trigger(respuesta);
			} else respuesta = null;
		}
	}
	req.open("GET", url);
	req.send("");
}
Pero con este método debo pasarle a la función un argumento que sea la acción a realizar con la respuesta. Me gustaría que la función ajax() sencillamente devolviese la respuesta, para poder hacer cosas como
Código:
texto_Respuesta = ajax(...)
. Lo he intentado almacenando el valor en una variable global:

Código:
var respuesta_global; //Variable global para intercambiar valores entre funciones
//Carga un script y su respuesta en texto o xml, y ejecuta la función especificada como parámetro
//La función funcion_trigger debe tener un parámetro que tomará el valor de la respuesta
function ajax(url, xml, funcion_trigger) {
	//Construye un manejador AJAX adecuado al navegador
	var req;
	variable_global = "segundo valor";
	try {
		// Opera 8.0+, Firefox, WebKit
		req = new XMLHttpRequest();
	} catch (e) {
		// Internet Explorer
		try{
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try{
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e){
				alert("Navegador no compatible con AJAX!");
				return false;
			}
		}
	}

	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			if (req.status == "200") {
				var respuesta;
				respuesta = (xml) ? req.responseXml:req.responseText;
				respuesta_global = respuesta;
			} else respuesta = null;
		}
	}
	req.open("GET", url);
	req.send("");

	return respuesta_global;
}
Pero así no funciona, ya que (no sé por qué) primero se ejecuta el return de ajax() y después la acción de onreadystatechange. ¿Cómo puedo resolver el problema? ¿Sabéis algún otro modo sencillo de devolver el contenido de la respuesta? (insisto, sin librerías tipo jQuery). Gracias!!!
  #2 (permalink)  
Antiguo 23/03/2009, 19:59
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: AJAX: devolver el valor de la respuesta

Eso sucede porque estás usando AJAX asíncrono. Para realizar lo que necesitas, debes usar AJAX síncrono, usando el tercer parámetro del método open en false:
Código javascript:
Ver original
  1. req.open("GET", url, false);
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 24/03/2009, 08:14
isra00
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: AJAX: devolver el valor de la respuesta

Muchas gracias, ahora es más fácil... debería leer más
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 18:11.