Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/08/2008, 09:21
mariano_donati
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 7 meses
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