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

readyState==4????

Estas en el tema de readyState==4???? en el foro de Frameworks JS en Foros del Web. El problema que tengo es el siguiente: Estoy realizando una carga masiva, mediante un modulo implementado en ajax La función que carga los datos es ...
  #1 (permalink)  
Antiguo 14/05/2009, 15:29
Avatar de razcoll  
Fecha de Ingreso: abril-2005
Mensajes: 76
Antigüedad: 19 años, 8 meses
Puntos: 1
Exclamación readyState==4????

El problema que tengo es el siguiente:

Estoy realizando una carga masiva, mediante un modulo implementado en ajax

La función que carga los datos es la siguiente:

Código PHP:
function cargador(div,page)
{
    var 
contenedorpreloader;
    
contenedor document.getElementById(div);
     
    
// creamos un nuevo objeto ajax
    
ajax=crearAjax();
   
    
ajax.open("GET"page,true);
   
    
ajax.onreadystatechange=function()
    {
        if(
ajax.readyState==1)
        {
            
contenedor.innerHTML "Cargando...";
            
contenedor.style.background "url('/cargador-ajax.gif') no-repeat center"
        }        
        else if (
ajax.readyState==4// Readystate 4 significa que ya acabó de cargarlo
        
{    
            if(
ajax.status==200)
            {
            
contenedor.innerHTML ajax.responseText;
            
contenedor.style.background "none"
            }        
        }
    }
    
ajax.send(null)

Hasta acá todo bien. Es más cuando las actualización es menor a 10 minutos, llega a READSTATE==4 y muestra el reporte de actualización.

Pero cuando la data a actualizar es de miles de registros... y demora mas tiempo (lo he probado mayor a 2 horas) se queda en READSTATE ==1. Pues el gif animado sigue funcionando, a pesar de que en la base de datos ya se actualizó... es más lo he dejado un par de horas mas y se queda en READSTATE ==1, es como si se hubiera colgado

Alguien tiene idea de lo que pasa??? ojo para tiempos pequeños no existe problema alguno, pero sí para tiempos grandes.

Gracias de antemano por las ideas.
  #2 (permalink)  
Antiguo 14/05/2009, 21:10
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 7 meses
Puntos: 35
Respuesta: readyState==4????

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


Pon esto:
Código PHP:
else if (ajax.readyState==4// Readystate 4 significa que ya acabó de cargarlo
        

            
alert(ajax.status);
            if(
ajax.status==200)
            { 
Y ve que sale.


connection closed.
__________________

Maborak Technologies
  #3 (permalink)  
Antiguo 15/05/2009, 17:54
Avatar de razcoll  
Fecha de Ingreso: abril-2005
Mensajes: 76
Antigüedad: 19 años, 8 meses
Puntos: 1
Respuesta: readyState==4????

Cuando el tiempo es corto, en el alert me devuelve 200 y funciona el responseText :)

Pero acabo de realizar lo mismo, en un tiempo mucho mas prolongado... cerca de 3 horas y me devolvio 12002, y el gif sigue dando vueltas y no me muestra el reporte de actualización, es decir no devuelve el responseText.
  #4 (permalink)  
Antiguo 16/05/2009, 06:18
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 7 meses
Puntos: 35
Respuesta: readyState==4????

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


Bueno, eso pasa porque tu conexion (tu conexion de internet) a expirado al procesar eso. Que velocidad de conexion tiene? Solo debe pasarte a ti.

Pero para evitar problemas.

comenta esto

Código PHP:
 
         
//   if(ajax.status==200)
         //  {
            
contenedor.innerHTML ajax.responseText;
            
contenedor.style.background "none"
         
// } 
Si esto no funciona, tendremos que implementar un Timer para tiempos muy largos de peticion.
Avisa resultados colega.

chau



connection closed.
__________________

Maborak Technologies
  #5 (permalink)  
Antiguo 19/05/2009, 15:06
Avatar de razcoll  
Fecha de Ingreso: abril-2005
Mensajes: 76
Antigüedad: 19 años, 8 meses
Puntos: 1
Respuesta: readyState==4????

Definitivamente para tiempos muy largos el ajax.status toma el valor de 12002 y no he logrado que me devuelva el mediante el ajax.responseText nada

En el caso que me sugeriste, la página queda en blanco y en la "Barra de estado" del Browser aparece "Terminado"... claro que en el servidor y la base de datos, se sigue trabajando (para tiempos grandes). Creo que una vez que está en terminado, se rompe la conexión con el Servidor y es por eso que no me devuelve nada :(

¿Como sería la Implementación de un Timer para tiempos largos?...

Ojo, para tiempos pequeños no tengo ningún problema

Gracias de antemano por la respuesta.

Salu2.
  #6 (permalink)  
Antiguo 19/05/2009, 20:32
 
Fecha de Ingreso: mayo-2009
Mensajes: 25
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: readyState==4????

Lo que puedes hacer es lo siguiente. tomá el archivo en PHP que ejecuta la actualización.
y haz que antes de comenzar el proces escriba un archivito.txt que contenga el número 0
cuando el proceso termine. que el script PHP modifique ese 0 por un 1
Luego en tu código ajax para iniciar el proceso haz la petición al scriptPHP1(el que procesa los cambios) y que automáticamente te devuelva un número que sea por ejemplo 2 que te indicará que el script comenzó a trabajar. una vez que te envió una respuesta READYstate cambiará a 4
y tu mira la respuesta.. si la respuesta es 2 entonces sabes que el script comenzó a funcionar
luego utiliza javascript. hay una función no me acuerdo ahora que ejecuta 1 función cada X cantidad de tiempo..
lo que tienes que hacer es mover tu GIF animada desde que recibiste el 2 como respuesta. del script1
y ejecutar una 2º función que le pida a un script PHP nº2 que revise el archivito que creó el primero
entonces si el scriptPHP2 te retorna 0
es porque el proceso del script PHP1 todavía no terminó
entonces tu sigues moviendo el GIF..
luego cuando termine el scriptPHP1 cambiará ese valor a 1
entonces cuando tu hagas la petición otra vez. verás que scriptPHP2 te retorna 1
en ese momento tu dejas de animar tu GIF y dices TODO LISTO!

EL problema:
el problema que estas padeciendo es el tiempo!
las conexiones de red tienen un tiempo máximo de respuesta.
no pueden permanecer "abiertas" por una cantidad infinita de tiempo
dependiendo de las configuraciones del servidor. hay algunos servidores que te envían un error!
y te cierran la conexión pero AL ENVIARTE el error tu detectas el fallo
pero hay otros que cierran la conexión de manera silenciosa y por lo tanto tu permaneces a la espera de que algo suceda pero en la realidad el hosting ya no está atendiendo tu petición porque su tiempo finalizó ;)
la solución entonces es crear ese "archivito pasarela" que te indicará cuando es que el proceso de actualización está en pié o si finalizó y hacer la consulta con un segundo script que revise el archivo.

TE DEJO UN SALU2
  #7 (permalink)  
Antiguo 26/05/2009, 16:01
Avatar de iandrade  
Fecha de Ingreso: septiembre-2006
Ubicación: Xalapa, Veracruz, MÉXICO.
Mensajes: 171
Antigüedad: 18 años, 2 meses
Puntos: 6
Respuesta: readyState==4????

AJAX no te resolverá el problema, como lo menciona morpheus747, las conexiones tienen un limite, ademas es asincrono, es decir que no se hace en linea o en un momento que tu definas, lo que puedes hacer es controlar tu proceso con otro mecanismo de scripting en el servidor y elabora un archivo de log que registre lo que hace el proceso y ahora si monitorea con AJAX ese arhivo de log, de lo contrario seguiras con este y con otros problemas.
__________________
No todo lo que se hace en segundo plano es AJAX
  #8 (permalink)  
Antiguo 26/05/2009, 16:35
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años, 7 meses
Puntos: 35
Respuesta: readyState==4????

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


Les propongo otra solucion.
Saben como funcionan los scripts donde puedes subir tu video y luego el sistema lo convierte a formato FLV.

Bueno lo normal sería que se suba un video y luego por ejemplo si el video es de media hora. toma 5 minutos transformarlo a FLV asi que el tiempo de espera para el cliente es:

Upload + Time conversion.

Y la solucion que le damos es, llamar a un archivo PHP por linea de comandos.

Código PHP:
$cmd="/usr/local/bin/php " $_SERVER['DOCUMENT_ROOT'] . "/members/videoupload/bg_convert.php $sourceflv $vkey $filename  > /dev/null &";
exec($cmd,$arr ); 
Y ponemos banderas en la base de datos indicando de que ese video se está convirtiendo (status: processing ). Y cuando termina de ejecutar el script php se cambia el estado (status: finished)

De esta forma, al usuario solo le damos la tarea de esperar mientras hace el upload

Upload process + Conversion ( in background)

espero se entienda la idea.

:)


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 09:31.