Foros del Web » Programando para Internet » Javascript »

Saber cuando AJAX ha terminado

Estas en el tema de Saber cuando AJAX ha terminado en el foro de Javascript en Foros del Web. Buenas! Tengo unas funciones (externas, que no son propias de mi hosting) que lanzan una rutina AJAX, la cual devuelve Texto (es decir, al final ...
  #1 (permalink)  
Antiguo 25/10/2012, 23:40
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Saber cuando AJAX ha terminado

Buenas!

Tengo unas funciones (externas, que no son propias de mi hosting) que lanzan una rutina AJAX, la cual devuelve Texto (es decir, al final hay un innerHTML = texto).

Posteriormente tengo que acceder a un elemento de lo retornado por AJAX.

El problema está en que no puede acceder al elemento porque cuando llega a esa línea de JS todavía no ha cargado el AJAX, no se si me explico.

Entonces le puse un setTimeout, para esperar que acabe el AJAX y que funcione bien.

El problema que le veo a esto es que si yo tengo mi conexión de internet a 30mb, con un timeout bajo me saldrá, pero alguien que tenga 1mb quizás no...

Entonces, cómo puedo hacer para saber cuándo el AJAX ha terminado?

Probé hacer un bloque Try/Catch en un bucle, así

Código:
function postAJAX(){
  b = false;

  while(!b){
    b = true;

    try{
      //cosas
    }catch(err){
      b = false;
    }
  }
}
pero claro, se me quedaba la web clavada en el bucle...

Mi idea es hacer algo así como: "pruebo de lanzar con un setTimeout, si falla vuelve a hacerlo; hasta que funcione", pero no sé si se puede "dormir" la rutina o algo así para que no se quede en un bucle infinito...

Gracias!
  #2 (permalink)  
Antiguo 26/10/2012, 05:18
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Saber cuando AJAX ha terminado

Si me fijo en el título la respuesta parece muy simple


Código Javascript:
Ver original
  1. if(peticion_http.readyState == 4) {
  2.       if(peticion_http.status == 200) {
  3.         alert(peticion_http.responseText);
  4.       }
  5.     }

El valor de la propiedad readyState determina el estado de la petición, y 4 te indica que terminó.
Ahora

Cita:
El problema está en que no puede acceder al elemento porque cuando llega a esa línea de JS todavía no ha cargado el AJAX, no se si me explico.
Ahi, ya no entiendo, cuál es la linea de js?, y con elemento, a que te refirís? supongo que a
elemento.innerHTML = texto

Explicate un poco más

SAludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #3 (permalink)  
Antiguo 26/10/2012, 05:31
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Respuesta: Saber cuando AJAX ha terminado

Te explico.

Primero se llaman a unas rutinas AJAX que definen unas variables.
Después se llama a una rutina AJAX que formatea un texto.

Finalmente necesito cambiar un simple color del texto que devuelve.

Digamos así:

Código:
externoAJAXvariables(){//define unas variables; digamos v1 y v2};

externoAJAXtexto(v1, v2){//recibe v1 y v2, y me devuelve un texto, en el cual hay un div con un ID que conozco y que quiero cambiar mediante JS};

propioJScambiaColor(){
document.getElementById(id).style.backgroundColor='#123546';
};
Entonces, si la ejecución la hago sin pausas me falla ya que llama a la segunda rutina cuando la primera aún no ha terminado (y por tanto las variables no están definidas y me da error de JS).

Del mismo modo, se lanza la tercera función sin que esté la segunda completa, por lo que más de lo mismo.

Así, tengo hecho esto:

Código:
externoAJAXvariables();
window.setTimeout("externoAJAXtexto(), 1200);
window.setTimeout("propioJScambiaColor(), 2000);
A mí en mi navegador me funciona, y en general funciona bien. El problema es que no sé si con una conexión lenta bastarán 1,2 segundos, por eso comentaba lo de esperar a que terminara.

Espero que ahora sí quede algo más claro.

Saludos!
  #4 (permalink)  
Antiguo 26/10/2012, 05:58
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Saber cuando AJAX ha terminado

A ver, la lectura del documento por parte del navegador es secuencial, podés en todo caso determinar que evento dispará la ejecución, no es lo mismo

Código HTML:
Ver original
  1. document.getElementById('x');
  2. <div id="x"></div>

Error , porque tu script está intentando identificar un elemento antes de que la página sea cargada

Código HTML:
Ver original
  1. <div id="x"></div>
  2. document.getElementById('x');

Correcto, ya que el elemento de id x ya se cargó

Código HTML:
Ver original
  1. functio carga(){
  2. document.getElementById('x');
  3. }
  4.  
  5. window.onload = carga;
  6. <div id="x"></div>
Correcto también, ya que si bien la función está definida antes, no se ejecutará hasta que el documento sea cargado

La aplicación de una demora mediante setTimeout(), no te modifica nada en este caso, porque aunque la apliques a una función específica, lo único que hace es demorar todo.
Lo que si observo, es que en
Código Javascript:
Ver original
  1. propioJScambiaColor(){
  2. document.getElementById(id).style.backgroundColor='#123546';
  3. };

hay un error (bueno, no sé si lo pusiste como ejemplo, o lo tenés exactamente asi) ya que estás haciendo getElementById(id). utilizando una variable, que no es pasada a la función propioJsCambiaColor()

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 26/10/2012, 06:32
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Respuesta: Saber cuando AJAX ha terminado

Cierto, cierto... lo estuve pensando y conseguí que funcionara. También he creado un sistema para no tener que esperar tanto usando cookies (primero creo las variables, espero, las pongo en una cookie y luego le envío los datos. En las siguientes ejecuciones ya no hace falta crear las variables porque están en la cookie).

Lo que comentas del fallo, lo sé. Lo he puesto así para que veas que llamo a un id "externo".

Saludos!

Etiquetas: ajax, funcion, html, js
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 20:43.