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

Procesos Ajax Simultaneos

Estas en el tema de Procesos Ajax Simultaneos en el foro de Frameworks JS en Foros del Web. Hola, Buenas tardes espero me puedan ayudar con este problemita. Resulta que tengo una pagina en donde muestro una tabla de resultados en forma de ...
  #1 (permalink)  
Antiguo 06/10/2008, 16:12
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Procesos Ajax Simultaneos

Hola,
Buenas tardes espero me puedan ayudar con este problemita.

Resulta que tengo una pagina en donde muestro una tabla de resultados en forma de lista de una consulta a una base de datos, en esta tabla muestro nombre, puesto, departamento, mail, status.(alrededor de 30 registros).
esta pagina tiene un boton que al pulsarlo empieza una función ajax para el envio de un email a todos los empleados que se encuentran en esa base de datos y que aparecen en la tabla.

la funcion ajax llama a otra pagina php que por medio de un while envía los email a cada uno y a medida que los manda actualiza la base de datos poniendo a casa registro si se envio o no.
una vez terminado el envío esta funcion ajax recoge la leyenda de envio terminado y la muestra en un pequeño <div>.

El problem es que quisiera que a medida que se vayan enviado me vaya sacando en tiempo real en la tabla donde dice status si fué enviado o no, y continue con el siguiente hasta que termine.

he probado poniendo otra funcion ajax para la actualización cada 2 seg. de esa tabla , para que vaya recogiendo los datos de la base y los vaya poniendo en la pagina a medida que la funcion de envios en php se está ejecutando, pero no me actualiza nada sino hasta que la primera funcion ajax termino y recien ahí me muestra todos los resultados en la pantalla con el campo status actualizada.
es decir hasta que no termina una no empiza la otra.
¿Como podría solucionar esto?

Espero me haya explicado mas o menos bien, sino me dicen para explicarme un poco mejor.

Gracias
  #2 (permalink)  
Antiguo 06/10/2008, 16:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Procesos Ajax Simultaneos

Hola tiranuss,

Habria que ver tu script como lo estas haciendo ya que en teoria puedes lanzar los 2 o "n" procesos en simultaneo desde tu script sin ningún problema.

Saludos.
  #3 (permalink)  
Antiguo 06/10/2008, 17:30
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Procesos Ajax Simultaneos

Gracias por responder GatorV

Esta es la pagina principal, como verás para actualizar la tabla cada x seg. uso la clase prototype.
En ésta pagina solo muestro la tabla como está inicialmente en la base de datos.

Código:
<html>
<head>
<title></title>
<script src="prototype.js" language="javascript"></script>

<script language="JavaScript" type="text/javascript">
function nuevoAjax()
{
    var xmlhttp=false;
    try
    {
        // Creacion del objeto AJAX para navegadores no IE
        xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e)
    {
        try
        {
            // Creacion del objet AJAX para IE
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch(E) { xmlhttp=false; }
    }
    if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp=new XMLHttpRequest(); }

    return xmlhttp;
} 

function cargaenvios()
{

ajax=nuevoAjax();
ajax.open("POST", "enviar.php", true);
document.getElementById("empezar").value= "Enviando";
document.getElementById("empezar").disabled= "disabled";
ajax.onreadystatechange=function()
{
    if (ajax.readyState==4)
    {
        document.getElementById("envi").innerHTML=ajax.responseText;
    }else{
        document.getElementById("envi").innerHTML='<img src="loader.gif" align="middle" /> Enviando...';

}
}
ajax.send();
}  

function tablamail() {

            var target = $('tabla');

            if (!target) return false;

            new Ajax.PeriodicalUpdater(target, 'tabla.php',{frequency:'2'});

        }    
 </script>

</head>
<body onload="tablamail()">

<input type="button" id="empezar" name="empezar" value="Empezar envio" onclick="javascript:cargaenvios();" />

<div id="envi"></div>
<br><br>

<div id="tabla">
<?
include ("../../conexion.php");
$link=Conectarse();

$query = mysql_query("SELECT * FROM empleados ") or die(mysql_error());

echo "<table  border=\"1\">
<tr><td><b>nombre</b></td>
<td><b>puesto</b></td>
<td><b>departamento</b></td>
<td><b>email</b></td>
<td><b>status</b></td>
</tr>";

while ($row = mysql_fetch_array($query)){

echo "<tr><td>$row[nombre]</td><td>$row[puesto]</td><td>$row[departamento]</td><td>$row[email]</td><td>$row[status]</td></tr>";
}


echo "</table>";
?>
</div>
</body>
</html>
luego llamo con ajax a la pagina enviar.php, haciendo click en el boton "Empezar envio", que me hace todos los envios de cada uno de los mails que va sacando de la base con un while y me actualiza uno por uno el status en la base.


Por otro lado la llamada ajax a la pagina de actualizacion (tabla.php) cada x segundos tiene practicamente esto, donde solo recoge nuevamente los valores y actualiza la tabla principal:

Código:
<?
include ("../../conexion.php");
$link=Conectarse();

$query = mysql_query("SELECT * FROM empleados ") or die(mysql_error());

echo "<table  border="1">
 <tr><td><b>nombre</b></td>
 <td><b>puesto</b></td>
 <td><b>departamento</b></td>
 <td><b>email</b></td>
 <td><b>status</b></td>
 </tr>";

while ($row = mysql_fetch_array($query)){

echo "<tr><td>$row[nombre]</td><td>$row[puesto]</td><td>$row[departamento]</td><td>$row[email]</td><td>$row[status]</td></tr>";
}


echo "</table>";
?>
El problema es que hasta que no termina el envío y el primer ajax recoge "envio terminado" desde el script php (enviar.php) recién ahí me muestra la tabla actualizada.
no lo hace en tiempo real o cada 2 seg. se actualizara para que pareciera en tiempo real.

Ojala me haya explicado un poco mas con el codigo...
  #4 (permalink)  
Antiguo 06/10/2008, 20:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Procesos Ajax Simultaneos

Mmm puede ser que el otro script no haga los cambios conforme va enviando, puedes ponerlo?

Saludos.
  #5 (permalink)  
Antiguo 06/10/2008, 21:45
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Procesos Ajax Simultaneos

gracias por contestar nuevamente,
el script php que llama el primer ajax (enviar.php) para realizar el envio de los correos es este, basicamente usa la clase phpmailer para los envios, actualiza la base poniendo si se envía o no y regresa una leyenda "Envios terminados" el finalizar el while.

Código:
<?php
include ("../../conexion.php");
$link=Conectarse();

require "phpmailer/class.phpmailer.php";
$mail = new phpmailer();

$mail->PluginDir = "phpmailer/";
$mail->SetLanguage("es","phpmailer/");
$mail->IsHTML(true);
$mail->IsSMTP(true);
$mail->Host = " ***.***.***.*** "; // Por seguridad no pondre la direccion de smtp
$mail->SMTPAuth = 'true';
$mail->Username = "admin"; //nombre usuario smtp
$mail->Password = "admin123"; // pass smtp

$query = mysql_query("SELECT * FROM empleados ") or die(mysql_error());

while ($dat = mysql_fetch_array($query)){

$mail->From = "[email protected]";
$mail->FromName = "Actualidades";

$mail->Timeout=20;

$mail->AddAddress($dat['email'],$dat['nombre']);

$mail->Subject = "Actualidades internas";
$mail->Body = " No tenemos actualidades en la empresa";

$email1 = $dat['email'];
$nombre = $dat['nombre'];

if(!$mail->Send())
{
mysql_query("Update empleados set status = 'rechazado' where email like '$email1' and nombre like '$nombre' ") or die(mysql_error());
}
else
{
mysql_query("Update empleados set status = 'enviado' where email like '$email1' and nombre like '$nombre' ") or die(mysql_error());
}

$mail->ClearAddresses();


};

echo "Envios Terminados";

?>
Todo funciona perfectamente, la base es actualizada correctamente, los correos son enviados y llegan a su destinatario perfectamente, mi unico inconveniente es el que no puedo actualizar en tiempo real la tabla de la pagina principal, para que vaya poniendo enviado o no enviado en la colunma status a medida que se van enviado y se va actualiando la base de datos.

al parecer no puedo hacer que los dos procesos ajax funcionen simultaneamente, si pudiera hacerlo se podría ver que mientras uno empezó y arrancó el script php para el envio de correos el otro actualiza la tabla mostrando los datos actualizados desde la base. y daria un efecto de actuaizacion en tiempo real.

o puede ser que como bien dices GatorV, este script no esté actualizando la base de datos a medida que envía, sino hasta que se termine totalmente el while, lo cual tambien me crea dudas porque en una lista grande de envios se almacenarían muchas respuestas para que finalmente al terminar el script se llene la base de datos con estos.
mmmm no se, no creo que pase esto, pero puede ser, me inclino mas a que mis llamadas ajax no trabajan juntas.

Última edición por tiranuss; 06/10/2008 a las 22:37
  #6 (permalink)  
Antiguo 07/10/2008, 08:34
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Procesos Ajax Simultaneos

Lo que puedes hacer para hacer "debug" es imprimir un texto aleatorio en el script que actualiza, con rand(), así puedes ver que si te empieza a imprimir el texto aleatorio puedes identificar de donde esta el problema.

Por otro lado cuando usamos AJAX es muy recomendable usar el Firebug de Firefox, te ayuda bastante a monitorear tus transacciones por AJAX y el resultado de ellas.

Saludos.
  #7 (permalink)  
Antiguo 07/10/2008, 09:12
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Procesos Ajax Simultaneos

Muchas gracias por la recomendación GatorV,
voy a intentar utilizar el Firebug de Firefox para detectar algún posible error,
y también un debug en el script que actualiza a ver si me imprime.

en un momento te comento como me fué y si encontré algún problema.

Gracias!!!
  #8 (permalink)  
Antiguo 07/10/2008, 12:45
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Procesos Ajax Simultaneos

Mmm... sigo sin encontrar alguna solución, he revisado el script y esta bien, no se usar muy bien el FireBug pero aun así no encuentro nada raro....
  #9 (permalink)  
Antiguo 07/10/2008, 13:10
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Procesos Ajax Simultaneos

En el firebug al habilitarlo en el panel del Firebug puedes ver en la consola los requests, lo que se envio y el resultado, eso te puede ayudar a ver que te responde el servidor o porque se "para" el script en cierto lado.

Saludos.
  #10 (permalink)  
Antiguo 07/10/2008, 20:25
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Procesos Ajax Simultaneos

Muchas gracias GatorV por tu ayuda. de verdad te lo agradezco.
la verdad es que no he podido resolver esto aún, y no estoy seguro de que se pueda hacer, posiblemente si, pero no se como,
Firebug no me lanza nada raro o no me dice donde puede estar el error.

Alguna otra idea para lograr que los dos script de Ajax funcionen simultáneamente?

Gracias
  #11 (permalink)  
Antiguo 08/10/2008, 04:51
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Procesos Ajax Simultaneos

Un par de comentarios:

- Si estás utilizando ya la librería Prototype para alguna cosa, ¿por qué no la utilizas para más cosas? Quiero decir, tienes en la librería unas funciones muy probadas para hacer llamadas con AJAX. Veo que usas el PeriodicalUpdater, pero ¿por qué sigues usando "nuevoAjax" y haciendo la llamada "a mano"?

- ¿Qué tipo de conexión abres con la Base de Datos en Conectarse()? ¿Estás realmente abriendo una conexión nueva para cada proceso o tienes algún tipo de conexión compartida? En la misma línea ¿cómo tienes configurada la base de datos? ¿Hay algún tipo de bloqueo de tablas o gestión de transacciones?
  #12 (permalink)  
Antiguo 08/10/2008, 08:28
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Procesos Ajax Simultaneos

Hola Venkman, gracias por contestar y por tus comentario,
respondiéndote, en lo primero que comentas tienes toda la razón, lo que paso es que desde un principio que hice el código no utilizaba prototype y luego lo incluí solo para actualizar porque el nuevoAjax hecho a mano me funcionó muy bien, pero aún así tienes toda la razon así que modifiqué el codigo para reemplazar el script NuevoAjax por una llamada Ajax.Request con prototype el cual me quedó así,
lo pongo porque siempre es bueno mostrar codigo, tal vez a alguien le pueda ser util.

Código:
<script language="JavaScript" type="text/javascript">

function cargaenvios(){

new Ajax.Request("enviar.php", {
onSuccess : function(resp) {
document.getElementById("envi").innerHTML= resp.responseText;
},
onCreate : function(resp) {
document.getElementById("envi").innerHTML='<img src="loader.gif" align="middle" /> Enviando...';
tablamail();
},
});

}


function tablamail() {

            var target = $('tabla');

            if (!target) return false;

            new Ajax.PeriodicalUpdater(target, 'tabla.php',{frequency:'2'});

        }
 </script>
y así me funciona exactamente igual que el código anterior, aún no logro hacer que me vaya mostrado en pantalla los resultados muestras el sistema va enviando pero por lo menos ya ambos scripts usan prototype.


el -> include ("../../conexion.php"); $link=Conectarse(); el archivo conexion.php contiene esto:

Código:
function Conectarse()
{
   if (!($link=mysql_connect("localhost","aqui pongo usuario","aqui pongo password")))
   {
      echo "Error conectando a la base de datos.";
      exit();
   }
   if (!mysql_select_db("nombre de la base",$link))
   {
      echo "Error seleccionando la base de datos.";
      exit();
   }
   return $link;
}
que bueno, finalmente no tengo ningún problema con las conexiones a la base de datos.
en lo ultimo que me comentas si es que tengo algún bloqueo de tablas o gestión de transacciones realmente lo desconozco donde podría ver eso?

Lo que no puedo hacer es que cuando llamo al script función cargaenvios() esta empieza a ejecutar el archivo enviar.php el cual tiene un bucle para el envio de los correos a todos los empleados registrados en la base,(esta ejecución digamos que es en segundo plano) a medida que envia uno por uno actualiza la base poniendo si se envió o no; mientras quisiera que en la pantalla principal el segundo script tablamail() me vaya actualizando la tabla para que tenga un efecto de tiempo real viendo cuales se han enviado y cuales todavia faltan en salir.

Gracias por la ayuda...
  #13 (permalink)  
Antiguo 08/10/2008, 11:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Procesos Ajax Simultaneos

Lo que te comentaba era que hicieras algo como esto para que veas si tu segunda consulta esta funcionando:
Código php:
Ver original
  1. <?
  2. include ("../../conexion.php");
  3. $link=Conectarse();
  4.  
  5. $query = mysql_query("SELECT * FROM empleados ") or die(mysql_error());
  6.  
  7. echo "<table  border="1">
  8. <tr><td><b>nombre</b></td>
  9. <td><b>puesto</b></td>
  10. <td><b>departamento</b></td>
  11. <td><b>email</b></td>
  12. <td><b>status</b></td>
  13. </tr>";
  14.  
  15. while ($row = mysql_fetch_array($query)){
  16.  
  17. echo "<tr><td>$row[nombre]</td><td>$row[puesto]</td><td>$row[departamento]</td><td>$row[email]</td><td>$row[status]</td></tr>";
  18. }
  19.  
  20.  
  21. echo "</table>";
  22. echo "From AJAX: " . rand(0, 100);
  23. ?>

Si empiezas a ver el From AJAX en el fondo con diferentes numeros es que entonces si esta procesando la segunda llamada, es solamente que tu script de envio no te esta actualizando en tiempo real la tabla.

Saludos.
  #14 (permalink)  
Antiguo 09/10/2008, 08:45
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Procesos Ajax Simultaneos

Que tal GatorV, gracias nuevamente por la respuesta.

te cuento que hice lo que me dijiste, agregué el echo "From AJAX: " . rand(0, 100); al código y efectivamente al cargar la página empiezan a cambiar los números cada 2 segundos, pero al momento que doy click en el boton "Empezar envio", para llamar a la funcion New Ajax.Request("enviar.php")..... la actualización se queda pausada. como para dar lugar a que esta llamada para el envio de correos termine y una vez que terminó, ahí continua la actualización de los números del rand(0,100);
  #15 (permalink)  
Antiguo 09/10/2008, 08:57
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Procesos Ajax Simultaneos

Mmm entonces en efecto la segunda llamada no se esta efectuando, muy raro... Nunca he tenido problemas para enviar dos requests AJAX al mismo tiempo y procesarlos... ¿Con que explorador estas checando?

Saludos.
  #16 (permalink)  
Antiguo 09/10/2008, 09:24
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Procesos Ajax Simultaneos

Con Internet Explorer 7 y con Firefox 3.0 ... con ambos pasa lo mismo, la actualización se pausa y al terminar los envíos continua la actualización cada 2 segundos
  #17 (permalink)  
Antiguo 09/10/2008, 10:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Procesos Ajax Simultaneos

Mmm no veo el porque se detiene, como te comento he usado procesos ajax simultaneos (con prototype precisamente) y nunca me habia pasado algo así...
  #18 (permalink)  
Antiguo 09/10/2008, 10:49
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Procesos Ajax Simultaneos

Si es muy extraño, aparentemente está todo bien, pero bueno, seguiré intentando cosas a ver si en una de esas encuentro la falla.
Si encuentro el problema y la solución por supuesto lo pondré.
Estuve viendo sobre el asynchronous de prototype pero también esta en true por default asi que por ahí tampoco va el asunto.

bueno pues, agradezco muchísimo tu ayuda GatorV, y cualquier cosa que me puedas aportar para poder solucionar esto, o tambien alguna persona que sepa algo, se lo agradeceré infinitamente.
  #19 (permalink)  
Antiguo 09/10/2008, 15:10
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Procesos Ajax Simultaneos

perdón, confusión
  #20 (permalink)  
Antiguo 03/11/2008, 10:47
 
Fecha de Ingreso: julio-2008
Mensajes: 208
Antigüedad: 15 años, 10 meses
Puntos: 5
Respuesta: Procesos Ajax Simultaneos

Prueba seteando un tiempo con JavaScript cuando haces la llamada para la peticion Ajax:

setTimeout('Nombre_de_la_Funcion(parametros)',50);// Ponle un tiempo chico como 50 microssegundos para que no enviese procesos simultaneos.

Yo tengo una funcion que me refresca el Ingreso de datos a una Base "visualmente" que es como tu dices y utilizo:
setTimeout('Refrescar_Ingreso(dia)',50);

Saludos...Espero sirva de algo...
  #21 (permalink)  
Antiguo 07/11/2008, 02:06
 
Fecha de Ingreso: enero-2008
Mensajes: 33
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Procesos Ajax Simultaneos

Disculpen si me equivoco, pero una peticion AJAX no devuelve valor hasta que termine. Si quieres que tras cada email enviado te actualice el status, mi sugerencia es que en lugar del tener el "while" en el archivo PHP lo tengas en el archivo en que manejas el ajax. El problema que yo veo en este caso es que harias tantas peticiones como email que enviar.

Otra opcion que veo es crear una tabla temporar donde guardas los datos de envio(Informacion que vas a mostrar en pantalla junto con el status) y mientas una peticion se encarga de el envio de los email y actualizacion de la tabla temporar, otra peticion ajax consulta la tabla temporal actualizando los datos en pantalla.

Lo anterior lo sugiero si el proceso de envio es demorado, produto de una inmensa cantidad de email, pero sino, con una imagen animada que de la sensacion de procesos, y algunos cuantos segundos de espera para mostrar el reporte final, creo que las sugerencias anteriores son mas una labor de estudio e investigacion propios, que solucion a un problema inexistente.

ya lo dijo alguien alguna ves.. "keep it simple"
  #22 (permalink)  
Antiguo 07/11/2008, 15:56
Avatar de tiranuss  
Fecha de Ingreso: enero-2008
Mensajes: 30
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Procesos Ajax Simultaneos

Muchas gracias sandinosaso y feloton79 por sus respuestas.
les agradezco a todos sus propuestas y ayudas.

Lo que he hecho para solucionar un poco esto, es una llamada a la funcion ajax con cada envío y dirección de email dirferente, actualizando el status en la base de datos y refrezcando la tabla cada vez que termina una llamada, para que aparezca si fué enviado o no.
regresando en el resp.responseText de la funcion otro javascript que ejecuta nuevamente la función ajax con la dirección de email que sigue, y asi sucesivamente hasta que termine la lista.

Tal vez no es la mejor manera, pero funciona.
ya no son procesos simultaneos sino que son muchos consecutivos.
  #23 (permalink)  
Antiguo 07/11/2008, 16:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Procesos Ajax Simultaneos

Deberias de darle una leida al codigo de este sitio: http://usernamecheck.com/, creo hacen algo similar a lo que quieres.

Saludos.
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 12:14.