Comunidad de diseño web y desarrollo en internet online

Método o función de espera en Javascript?

Citar            
MensajeEscrito el 17 Oct 2011 02:55 pm
Saludos:

Tengo una función en Javascript que debe abrir un archivo en PHP, de la forma:

Código Javascript :

ajax.open("GET", "valoracion.php?idPost="+separaCadHijos[i]+"&valoracion="+valoracionSeleccionada+"&actualiza="+actualiza,true);


Como se puede observar, estos parámetros varían en cada llamada al archivo PHP, es decir, tengo ese OPEN metido dentro de un bucle FOR, es decir:

Código Javascript :

for(i=0;i<numHijos-1;i++)
  {
   var selectorValoracionHijo=document.getElementById("valoracionHijos"+separaCadHijos[i]);
   selectorValoracionHijo.options[selectorValoracionHijo.selectedIndex].value=valoracionSeleccionada;
   //alert("idPost-> "+idPost+", idHijo-> "+separaCadHijos[i]+", valoracion-> "+valoracionSeleccionada+ ", actualiza-> "+actualiza);
   contenedorValoracion=document.getElementById("hidden");
   ajax.open("GET", "valoracion.php?idPost="+separaCadHijos[i]+"&valoracion="+valoracionSeleccionada+"&actualiza="+actualiza,true);
    ajax.onreadystatechange=function()
    {
      if(ajax.readyState==4)
      {
        contenedorValoracion.innerHTML = ajax.responseText;
      }
    }
    ajax.send(null);  
  }


Mi problema es que en ese archivo de PHP se hace un INSERT/UPDATE, que actualiza la base de datos con MYSQL. Y si pongo el ALERT que está comentado, es cuando me funciona bien, ya que obliga a esperar un tiempo razonable por cada iteración (para que dé tiempo a la BBDD). Si no pongo el ALERT, se me actualizan 3 o 4 filas, pero no todas. Supongo que es porque se ejecuta paralelamente el archivo PHP y la nueva iteración de AJAX¿?

¿Hay alguna forma más "elegante" de solucionar ésto?

Por jomafer

14 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Oct 2011 04:43 pm
Lo que necesitas es ejecutar en serie lo que por naturaleza ocurre en paralelo (o casi).

Pues bien, en tu lugar no usaría un for sino que la variable de indice hacerla global inicializada en cero. Cada vez que recibes la respuesta AJAX aumentar ese índice y si el índice es menor al límite superior (numHijos-1 en tu caso) aumentar el índice y proceder a lanzar la siguiente petición AJAX.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 17 Oct 2011 06:51 pm
Muchísimas gracias! la verdad es que me has orientado muchísimo en algo en lo que llevaba tiempo comiendome la cabeza.

Ahora en cuanto tenga un ratillo lo probaré! de verdad muchas gracias de nuevo!

Por jomafer

14 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Oct 2011 11:16 pm
Hola DriverOp!

Al final lo he conseguido, aunque no llegué a probar la forma que me dijiste, porque la veía un poco "inviable" en el contexto de mi programa.

Lo he logrado creando el objeto ajax, pero dentro del for, con lo cual me crea un objeto para cada iteración. Por ahora me lo hace bien, no se si lo hara cuando tenga mucha más carga mi programa, porque la verdad, lo hice probando, pero tampoco es que lo entienda a la perfección.

Código Javascript :

for(i=0;i<numHijos-1;i++)
  {
   var ajax=nuevoAjax();
   selectorValoracionHijo=document.getElementById("valoracionHijos"+separaCadHijos[i]);
   selectorValoracionHijo.value=valoracionSeleccionada;
   var contenedorValoracion=document.getElementById("hidden"+separaCadHijos[i]);
   ajax.open("GET", "valoracion.php?idPost="+separaCadHijos[i]+"&valoracion="+valoracionSeleccionada+"&actualiza="+actualiza,true);
   ajax.onreadystatechange=function()
   {
     if(ajax.readyState==4)
     {
       contenedorValoracion.innerHTML = ajax.responseText;
     }
   }
   ajax.send(null);  
  }


En cualquier caso, si alguien me pudiera aclarar por qué ahora no se pisan y antes sí, le estaría muy agradecido.

Gracias!!!!

Por jomafer

14 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.