7

No puedo entender por qué el prototipo suprime los mensajes de error en el evento dom:loaded y en los controladores AJAX.Prototype JS traga errores en dom: cargado, y ajax callbacks?

Dado el siguiente fragmento de HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Conforming XHTML 1.1 Template</title> 
     <script type="text/javascript" src="prototype.js"></script> 
     <script type="text/javascript"> 
      document.observe('dom:loaded', function() { 
       console.log('domready'); 
       console.log(idontexist); 
      }); 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

Se desencadena el evento domready, veo el registro en la consola, pero no hay ninguna indicación de cualquier error de ningún tipo. Si mueve la línea de console.log(idontexist); fuera del manipulador, se obtiene la idontexist

no se define

error en la consola. Me parece un poco raro, que en otros manejadores de eventos, como 'clic', aparece el mensaje de error, parece que es solo el dom:loaded el que tiene este problema.

Lo mismo vale para los manipuladores de AJAX:

new Ajax.Request('/', { 
    method: 'get', 
    onComplete: function(r) { 
     console.log('xhr complete'); 
     alert(youwontseeme); 
    } 
}); 

Usted no verá ningún error. Esto es con prototype.js 1.6.1, y no puedo encontrar ninguna indicación de este comportamiento en los documentos, ni una forma de habilitar el informe de errores en estos controladores.

he intentado recorrer el código con el depurador de FireBug, y parece que saltar a una función en la línea 53 llamado K, cuando se encuentra con la variable que falta en el controlador dom:loaded:

K: function(x) { return x } 

Pero, ¿cómo? ¿Por qué? ¿Cuando? No puedo ver ningún bloque try/catch allí, ¿cómo termina el flujo del programa?

Sé que puedo hacer que los errores sean visibles empacando mi controlador dom:ready en bloques try/catch, pero esa no es una opción muy cómoda. Lo mismo ocurre con el registro de un controlador global onException para las llamadas AJAX.

¿Por qué incluso suprime los errores? ¿Alguien se encontró con esto antes?

Respuesta

5

después de un tiempo me encontré con que el prototipo redirige todas las excepciones al manejador onException:

new Ajax.Request('/ajax_html_echo', { 
    method: 'get', 
    onComplete: function(r) { 
     console.log('xhr complete'); 
     alert(undefinedVar) 
    }, 
    onException: function(request,e){ 
     console.log(e.message); // prints undefinedVar is not defined 
    } 
}); 

información más aquí

http://www.prototypejs.org/api/ajax/options

onException activa cada vez que surge un error XHR . Tiene una firma personalizada: el primer argumento es el solicitante (es decir, una instancia de Ajax.Request), el segundo es el objeto de excepción .

+2

Mientras que sí, esta es una solución parcial, he mencionado que me gustaría ver una solución sin registrarse onException un controlador global para la llamadas AJAX, y esto también se aplica a la per- solicite controladores. –

2

También puede volver a emitir la excepción de onException y obtendrá en la misma forma que si hubiera sucedido fuera de la llamada

onException: function(request,e){throw e;} 
0

trabajado para mí

Ajax.Responders

Un depósito de oyentes globales notificados sobre cada paso de las solicitudes de Ajax basadas en prototipos.

http://api.prototypejs.org/ajax/Ajax/Responders/

Ajax.Responders.register({ 
    onCreate: function() { 
    Ajax.activeRequestCount++; 
    }, 
    onComplete: function() { 
    Ajax.activeRequestCount--; 
    } 
}); 
Cuestiones relacionadas