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

Llamada asincrónica en intervalos de tiempo

Estas en el tema de Llamada asincrónica en intervalos de tiempo en el foro de Frameworks JS en Foros del Web. Hola a todos. Estoy creando una barra de progreso en ajax. Todo funciona correctamente salvo por un par de errores que me lanza la aplicación, ...
  #1 (permalink)  
Antiguo 13/08/2008, 09:21
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Llamada asincrónica en intervalos de tiempo

Hola a todos. Estoy creando una barra de progreso en ajax. Todo funciona correctamente salvo por un par de errores que me lanza la aplicación, pero que no afecta en definitiva al resultado del proceso de upload de archivos, ya que todos los archivos se suben correctamente al servidor, la barra de progreso se actualiza cada un segundo de manera correcta y toda la información que el servidor procesa acerca del progreso de la subida es transmitida de manera correcta. De todas formas, aparecen esta serie de errores que quiero eliminar para tener una aplicación limpia. Mi código es el siguiente:

Código PHP:
var obj;
var 
i;
var 
secs 0;
function 
send()
{
    
form document.getElementById('uploader');
    
form.target "iframe";
    
obj = new HttpRequest();
    
obj.setResponseType(3);
    
obj.oncomplete = function(){
        
json obj.getResponse();
        if ( 
json )
        {
            switch ( 
json.stat )
            {
                case 
'copying':
                    
document.getElementById('progress').innerHTML json.value ' Transfer Rate: ' json.transfer_rate;
                    break;    
                case 
'finished':
                    
clearInterval(i);
                    
document.getElementById('progress').innerHTML 'Finished';
                    break;
                case 
'cancel':
                    
document.getElementById('progress').innerHTML 'Aborted by user';
                    break;
                default:
                    
document.getElementById('progress').innerHTML 'Loading...';     
            }                    
        }
    }
    
document.getElementById('progress').innerHTML 'loading...';
    
form.submit();
    
setInterval(update,1000);    
}
function 
update()
{
    
secs += 1;
    
obj.loadAsync('progress.php');

La función send() es la que se llama cuando se presiona el botón para enviar el formulario. En ella creo un objeto Ajax (cree una clase HttpRequest para manejar esto), establezco el tipo de respuesta en la que el servidor transmitirá la información y además defino el handler cuando el proceso asincrónico se complete. Luego de esto se envia el formulario. Pero la parte más importante aquí es la última línea de esta función: i = setInterval(update,1000); Aquí llamo a update() cada un segundo. En está función está la llamada asincrónica para chequear el progreso del upload. El problema es que en los primeros segundos, esta función me está dando un error. El mismo es el siguiente:

Error: uncaught exception: [Exception... "Component returned failure code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]" nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame :: javascript: eval(__firebugTemp__); :: anonymous :: line 1" data: no]

Transcurrido un par de segundos este error desaparece. Una posible solución es establecer un intervalo cada 3 segundos, pero el chequeo del upload se debe hacer cada un segundo, por lo tanto esta solución no es una opción. Otra forma de solucionarlo es ubicar todo el código correspondiente al objeto ajax dentro de la función update(). Así es como quedaría el código:

Código PHP:
var obj;
var 
i;
var 
secs 0;
function 
send()
{
    
form document.getElementById('uploader');
    
form.target "iframe";    
    
document.getElementById('progress').innerHTML 'loading...';
    
form.submit();
    
setInterval(update,1000);    
}
function 
update()
{
    
secs += 1;
    
obj = new HttpRequest();
    
obj.setResponseType(3);
    
obj.oncomplete = function(){
        
json obj.getResponse();
        if ( 
json )
        {
            switch ( 
json.stat )
            {
                case 
'copying':
                    
document.getElementById('progress').innerHTML json.value ' Transfer Rate: ' json.transfer_rate;
                    break;    
                case 
'finished':
                    
clearInterval(i);
                    
document.getElementById('progress').innerHTML 'Finished';
                    break;
                case 
'cancel':
                    
document.getElementById('progress').innerHTML 'Aborted by user';
                    break;
                default:
                    
document.getElementById('progress').innerHTML 'Loading...';     
            }                    
        }
    }
    
obj.loadAsync('progress.php');

Pero de esta forma estoy creando un objeto ajax, estableciendo el tipo de respuesta y definiendo el handler cada segundo, por lo tanto tampoco me parece una buena opción. Una tercer opción es saber que está pasando y solucionarlo a partir de ello. ¿Por qué me da ese mensaje de error?. No encontré documentación al respecto. Estaré muy agradecido con cualquier ayuda, orientación, tip que me puedan brindar. Saludos.
__________________
Add, never Remove
  #2 (permalink)  
Antiguo 13/08/2008, 09:34
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Respuesta: Llamada asincrónica en intervalos de tiempo

Por Dios! ni bien posteo en foros del web siempre me inspira y puedo encontrar la solución, es decir, que hasta cuando no se reciben respuestas de sus magníficos usuarios acerca de un tema en concreto, foros del web funciona de cabala para resolver nuestros problemas ja. Resulta ser que estaba llamando sucesivas veces a la misma página sin haber terminado el proceso actual. Por lo tanto, agregando una variable que controle cuando se está llevando a cabo una petición y de acuerdo a esto enviar una nueva o no, pude solucionar el problema. La solución está en la variable async_complete. Les dejo el código:

Código PHP:
var obj;
var 
i;
var 
secs 0;
var 
async_complete true;
function 
send()
{
    
form document.getElementById('uploader');
    
form.target "iframe";
    
obj = new HttpRequest();
    
obj.setResponseType(3);
    
obj.oncomplete = function(){
        
async_complete true;
        
json obj.getResponse();
        if ( 
json )
        {
            switch ( 
json.stat )
            {
                case 
'copying':
                    
document.getElementById('progress').innerHTML json.value ' Transfer Rate: ' json.transfer_rate;
                    break;    
                case 
'finished':
                    
clearInterval(i);
                    
document.getElementById('progress').innerHTML 'Finished';
                    break;
                case 
'cancel':
                    
document.getElementById('progress').innerHTML 'Aborted by user';
                    break;
                default:
                    
document.getElementById('progress').innerHTML 'Loading...';     
            }                    
        }
    }
    
document.getElementById('progress').innerHTML 'loading...';
    
form.submit();
    
setInterval(update,1000);    
}
function 
update()
{
    
secs += 1;
    if ( 
async_complete )
    {    
        
async_complete false;
        
obj.loadAsync('progress.php');
    }

__________________
Add, never Remove
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 12:33.