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

Peticiones simultaneas

Estas en el tema de Peticiones simultaneas en el foro de Frameworks JS en Foros del Web. Ante todo quiero presentarme y comentarles lo bueno que me parecio este foro ya que encuentro gente con un alto grado de conocimiento que se ...
  #1 (permalink)  
Antiguo 26/01/2006, 14:56
 
Fecha de Ingreso: enero-2006
Mensajes: 5
Antigüedad: 18 años, 3 meses
Puntos: 0
Peticiones simultaneas

Ante todo quiero presentarme y comentarles lo bueno que me parecio este foro ya que encuentro gente con un alto grado de conocimiento que se acerca y ayuda a otra gente nueva.

Por otro lado quiero hacer una pequeña consulta teorica sober esto nuevo que descubri y se hace llamar AJAX (yo antes actualizaba mis paginas con pequeños frames minusculos que se actualizaban constantemente... ajax se ve mucho mas elegante y poderoso en ese sentido).

En fin la pregunta es:

¿¿¿ es posible hacer varias peticiones (entiendase documentos XML o metodos GET a un PHP mediante ajax) simultaneamente???

Muchas gracias por su tiempo y su conocimiento a todos!!
  #2 (permalink)  
Antiguo 31/01/2006, 11:41
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Es buena pregunta. Personalmente lo que hago es instanciar diferentes objetos así no se pisan, aunque no se si hay una manera mejor...me toco hacerlo una sola vez y busque la manera simple.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #3 (permalink)  
Antiguo 01/02/2006, 05:59
 
Fecha de Ingreso: septiembre-2005
Mensajes: 26
Antigüedad: 18 años, 7 meses
Puntos: 0
Hace un tiempo me enfrente con esto que estas comentando, la situacion era tener que llamar a un metodo ajax cuando un llamado anterior a este mismo metodo no se tenia la seguridad de que halla finalizado y no se debia esperar que finalice antes de realizar la 2da llamada. Hasta donde pude investigar tuve que duplicar este metodo (la parte de la instanciacion del objeto que meneja la llamada asincronica) y ahi podia llamarlo sin esperar que el otro finalizara, sino en muchos casos, por no decir, casi todos, alguno de los dos quedaba sin finalizar correctamente.


Si encuentran alguna forma se los agradeceria.


sl2
  #4 (permalink)  
Antiguo 01/02/2006, 07:31
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Seguramente haya una manera de verificar que un proceso haya terminado para poder llamar al otro, por lo que habría que guardar sucesos de estos.
De todas maneras hay que ver si esto es necesario para cada uno, en mi caso, uno no dependía del otro, así que si el segundo se ejecutaba antes que el primero me era indiferente, de hecho, la primer instancia podía tener mas proceso que esto no retrasaba la llamada de la segunda instancia.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #5 (permalink)  
Antiguo 02/02/2006, 05:22
 
Fecha de Ingreso: septiembre-2005
Mensajes: 26
Antigüedad: 18 años, 7 meses
Puntos: 0
Los que entendi que se planteaba es que para dos llamadas por ajax que se necesitaban hacer se queria usar el mismo objeto, es en esta situacion donde comentaba que se me presentaban errores. En mi caso las dos llamadas podian estar procesandose en un mismo momento, esto es, esperando resultados para los dos casos de informacion solicitada, siendo el mismo objeto httprequest, cuando cargab la segunda llamada, perdia la referencia a la primera.
  #6 (permalink)  
Antiguo 10/02/2006, 09:18
 
Fecha de Ingreso: octubre-2004
Mensajes: 878
Antigüedad: 19 años, 6 meses
Puntos: 1
Estoy probando en mi aplicacion, y si se le da a un segundo link que utilice ajax, sin que haya terminado la ejecucion del otro link que tambien ejecuta ajax, el primero no llega a terminarse, y solo se hace el segundo.
Alguien sabe alguna forma de que vaya cada nueva peticion en una nueva instanacia del xmlhttprequest para que no pase esto?
  #7 (permalink)  
Antiguo 12/02/2006, 21:24
 
Fecha de Ingreso: septiembre-2005
Mensajes: 26
Antigüedad: 18 años, 7 meses
Puntos: 0
Lo que tenes que hacer (asi lo solucione yo), es tener una variable por cada tipo de llamada ajax, esto es, en cada una instanciaras cada objeto xmlhttprequest para que cuando realices la llamada no sea por el mismo objeto que ya tiene una en curso.
sl2
  #8 (permalink)  
Antiguo 13/02/2006, 02:19
 
Fecha de Ingreso: octubre-2004
Mensajes: 878
Antigüedad: 19 años, 6 meses
Puntos: 1
Si pero tienes varios enlaces que generan una peticion ajax, y no es un nº fijo cuantas variables haces?
  #9 (permalink)  
Antiguo 21/02/2006, 05:44
Avatar de Necros  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 0
Parece que funciona
var i = 0;

function createAjaxObj(){
httprequest[i]=false;
if (window.XMLHttpRequest){ /* if Mozilla, Safari etc */
httprequest[i]=new XMLHttpRequest();
if (httprequest[i].overrideMimeType)
httprequest[i].overrideMimeType('text/xml');
............
__________________
By NeCrOS
FrEe WoRlD is FrEe CoDE
http://www.NeCrOS.com
  #10 (permalink)  
Antiguo 22/02/2006, 03:26
Avatar de Necros  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 0
He probado de meter sincronismo, he probado de meter de todo, y no consigo que se coma dos llamadas AJAX.

Seguiré investigando.

Si alguien lo tiene...

Acabo de ver una clase en PHP para AJAX CLSjsphp, no se si permitirá simultaneidad...

Alguien la ha probado ?
__________________
By NeCrOS
FrEe WoRlD is FrEe CoDE
http://www.NeCrOS.com
  #11 (permalink)  
Antiguo 22/02/2006, 05:09
 
Fecha de Ingreso: octubre-2004
Mensajes: 878
Antigüedad: 19 años, 6 meses
Puntos: 1
Os pongo como lo he conseguido yo:
Creo un array de objetos httpxmlrequest:
Código:
// Lista de instancias de objetos XMLHTTPRequest
var listaAjax= new Array();
Cuando hay que enviar una peticion creo una nueva instancia y la meto en la ultima posicion del array y mando el ide a la funcion de tratar la respuesta:

Código:
var http_request = newAjax();
var idAjax= listaAjax.length;
listaAjax[idAjax]= http_request;

// http://www.hhdirecto.net		
		
http_request.onreadystatechange = function() { tratarRespuesta(idAjax); };
http_request.open('POST', 'url', true);
http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
http_request.send(null);
listaAjax[idAjax]= http_request;
Despues en la funcion de tratar repuesta como tengo el id dentro del array sencillo...
Se admiten criticas, y mejoras...
  #12 (permalink)  
Antiguo 26/02/2006, 12:56
Avatar de Necros  
Fecha de Ingreso: enero-2002
Ubicación: Catalunya
Mensajes: 431
Antigüedad: 22 años, 2 meses
Puntos: 0
sería posible que volcaras el contenido de tu librería en AJAx, yo la tengo montada de diferente forma, el tema de la creación del objeto request y demás. Lo que me dificulta la creación de un array de llamadas...

Otra forma que he pensado es la siguiente, no se si es posible llevarla a cabo, y sería que la funcion de llamada a un AJAX, tubiera una funcion de parametro tipo CallBAck, osea, cuando terminara la solicitud AJAX, si existe un parametro funcion, esta se ejecutará. Esta función podría tratarse de otra llamada Ajax, con lo que podriamos tener llamadas secuenciales AJAX.

Ajax1(dsadsa,dsadasd,dsadas, AJAX2(a,b,c));

Consigo pasar el parametro función, pero no que el JS la ejecute ;) si alguien sabe como, aunque esto quizás pertenezca más al hilo de JS.

Gracias,
__________________
By NeCrOS
FrEe WoRlD is FrEe CoDE
http://www.NeCrOS.com
  #13 (permalink)  
Antiguo 01/03/2006, 05:21
 
Fecha de Ingreso: octubre-2004
Mensajes: 878
Antigüedad: 19 años, 6 meses
Puntos: 1
No utilizo ninguna librería solo esto:

Código:
// Crea una instancia XMLHTTPRequest
function newAjax()
{
		var http_request = false;
        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
                // Ver nota sobre esta linea al final
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Falla :( No es posible crear una instancia XMLHTTP');
            return false;
        }
        return http_request;

}
  #14 (permalink)  
Antiguo 26/04/2006, 06:09
 
Fecha de Ingreso: octubre-2004
Ubicación: Cork (Irlanda)
Mensajes: 161
Antigüedad: 19 años, 6 meses
Puntos: 1
Hola, a mi me ha ocurrido lo mismo, me he visto en la necesidad de hacer varias peticiones "a la vez".

Digo "a la vez" entre comillas porque en realidad lo que necesito es lanzar varias peticiones pero en un orden determinado. Esto lo intenté de la siguiente forma:

Código:
function manejadorDeOnClick(){
  for (i = 0;i < 5;i++){
    ajax = getHTTPObject();
    accion();
  };
};
La función getHTTPObject() es la típica para conseguir un objeto XMLHttpRequest.

Así, cuando se ejecuta el manejadorDeOnClick() de, por ejemplo, un botón, se debería ejecutar 5 veces accion(), cuyo código es el siguiente:

Código:
function accion(){
  // aquí recojo de un formulario una serie de valores en la variable params...
  ajax.open("POST",url,true);
  ajax.onreadystatechange = new Function("manejadorDeRespuesta();");
  ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  ajax.send(params);
};
Pero de este modo solo se finaliza correctamente la última llamada a accion(), las primeras parecen "perderse" en algún sitio.

Necesito pausar la ejecución del bucle for de la función manejadorDeOnClick() para no llamar a accion() antes de que la anterior llamada termine.

Lo he intentado poniendo la siguiente línea en el bucle for después de la llamada a accion() y casi lo consigo:

Código:
while (ajax.readyState == 4){};
El resultado que obtengo al final es el que espero pero entre accion() y accion() se queda como bloqueado y a los 10 segundos me sale un mensaje del navegador diciendo que una secuencia de órdenes puede estar ocupada o no se que, y me da la opción de continuar o parar. Si elijo continuar, al final obtengo lo que quiero pero claro... de esta manera no es lo deseado.

¿Habéis descubierto alguno como poder hacer esto? Soy todo oidos!!
  #15 (permalink)  
Antiguo 30/04/2006, 09:48
 
Fecha de Ingreso: junio-2002
Mensajes: 243
Antigüedad: 21 años, 10 meses
Puntos: 1
Buenas, he probado lo que dice wakewakeup y funciona perfectamente, a mi me parece una buena solución es bastante elegante.

para los que queráis hacer ajax encadenados, osease que hasta que no termine un ajax no se llame al siguiente, yo lo que he hecho es lo siguiente...

a la funcion que hace las llamadas ajax le paso un parametro el qual es la funcion a la que queiro llamar una vez termine el ajax, he puesto tb la opcion de si es 0 que no llame a ninguna funcion

entonces en la comprobacion del status==4 pongo lo siguiente...

else if (listAjax[idAjax].readyState==4)
{
document.getElementById(et_id).innerHTML=listAjax[idAjax].responseText;
if(fun_return!=0) fun_return();
}

donde fun_return es la funcion que le he pasado por parametro, yo la uso para llamar a otra funcion pero tb se puede usar para llamar a otro ajax.

Salu2.
  #16 (permalink)  
Antiguo 30/10/2007, 15:10
Avatar de gabyweb  
Fecha de Ingreso: enero-2002
Ubicación: Lima
Mensajes: 364
Antigüedad: 22 años, 3 meses
Puntos: 0
Re: Peticiones simultaneas

Podrías poner el código completo? a mí no me sale
__________________
Gaby :adios:
  #17 (permalink)  
Antiguo 07/11/2007, 10:47
MMG
 
Fecha de Ingreso: noviembre-2007
Mensajes: 1
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Peticiones simultaneas

Si por favor si pudieran colocar el código completo para tener una mejor apreciación.

Gracias
  #18 (permalink)  
Antiguo 10/02/2008, 06:23
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Re: Peticiones simultaneas

Yo he intentado aplicar lo de los arrays pero no me funciona. Si wakewakeup pudiera colgar el código completo sería de gran ayuda.

Yo tengo implementada una clase para hacer las peticiones AJAX. Es por ello que no entiendo por qué no funciona simplemente al hacer oAjax = new CAjax(...) y oAjax2 = new CAjax(...).
¿No debería crear una instancia diferente de todos y cada uno de sus atributos (incluido el xmlhttp)?
Código:
function sendRequest() 
{
	_http = this.http;
	_capa = this.capa;
	
	// efecto actualizando
	document.getElementById(_capa).innerHTML = this.processing_message;

		
	// Open PHP script for requests
	_http.open('post', this.accion + "?datehack=" + new Date().getTime(), true);
	_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	_http.onreadystatechange = function() {
			
		if( _http.readyState == 4 )
		{ 
			if( _http.status == 200 )
			{
				// Text returned FROM the PHP script
				var response = _http.responseText;
				
				if(response) 
				{
				 // UPDATE ajaxTest content
				 document.getElementById(_capa).innerHTML = response;
				}
			}
			else
			{
				document.getElementById(_capa).innerHTML = "Error: " + _http.status;
			}
		}
  	}

   _http.send(this.variables);

}


function CAjax(accion, variables, capa, processing_message)
{
	// atributos
	
		this.http = createRequestObject();
		this.accion = accion;
		this.variables = variables;
		this.capa = capa;
		this.processing_message = processing_message;
	
	
	// metodos
	
		this.procesa = sendRequest;
}
(La función createRequestObject es la típica para obtener un objeto xmlhttp).

¿Alguna ayuda?
  #19 (permalink)  
Antiguo 10/02/2008, 09:24
Avatar de Bellenger  
Fecha de Ingreso: noviembre-2004
Ubicación: En un lugar del Mundo...
Mensajes: 599
Antigüedad: 19 años, 5 meses
Puntos: 4
Re: Peticiones simultaneas

Carambas, carambitas este problema tambien me paso a mi, pues lo solucione de una manera digamos poco tradicional, basicamente lo que hice es hacer un retardo en la peticion al servidor asi:
Código:
  llamada_ajax1();
  setTimeout("llamada_ajax2()",100);
Solo qe hay un detalle, se trabaja sobre un mismo hilo, asi que parcialmente puede soluciona el problema, cuando si o si, existe una respuesta del servidor, pero en el caso de ejecucion dependiente, no he podido desarrollar un codigo para comrpobarlo jeje.
__________________
Un Caballero Jura Lealtad. Usa su espada para suprimir la Injusticia No Conoce el Odio y Tampoco el AMOR...
  #20 (permalink)  
Antiguo 12/02/2008, 11:08
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Re: Peticiones simultaneas

loading..............

No entendí bien, quieren hacer peticiones simultaneas... AL MISMO TIEMPO o FINALIZADA UNA PETICION LANZAR OTRA y OTRA y OTRA ?

connection closed.
__________________

Maborak Technologies
  #21 (permalink)  
Antiguo 12/02/2008, 11:19
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Re: Peticiones simultaneas

loading............


Si es el caso de mandar un lote, pues solo deben recorrerlo:

Código PHP:
var callbacks = [
   function(){
alert(rpc.responseText)},
   function(){
alert(rpc.responseText)},
   function(){
alert(rpc.responseText)},
   function(){
alert(rpc.responseText)}
];

for(var 
=0;i<callbacks.length;i++)
{
  var 
rpc xmlhhtpblabla()
  
rpc.onreadystatechange=callbacks[i];
  
//blabla

Claro que tendrán algunos problemas respecto a los closures y los pueden solucionar si ponen todo su proceso ajax en una clase.

Código PHP:
for(var =0;i<callbacks.length;i++)
{
  var 
rpc = new claseAjax({
        
method:"POST",
       
//otro
        
callback:callbacks[i]
   });

connection closed.
__________________

Maborak Technologies
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 21:29.