Estoy usando el editor ACE para la edición de JavaScript interactiva. Cuando configuro el editor en modo JavaScript, ACE determina automáticamente si el código es válido o no, con un mensaje de error y un número de línea resaltados cuando no lo es.Determine si la sintaxis de JavaScript es válida en el controlador de cambio de ACE
Durante el controlador de eventos change
, quiero detectar si ACE cree que el código es válido o no antes de intentar eval()
. La única manera que pensé que podría hacerlo es:
var jsMode = require("ace/mode/javascript").Mode;
var editor = ace.edit('mycode'), edEl = document.querySelector('#mycode');
editor.getSession().setMode(new jsMode);
editor.getSession().on('change',function(){
// bail out if ACE thinks there's an error
if (edEl.querySelector('div.ace_gutter-cell.ace_error')) return;
try{
eval(editor.getSession().getValue());
}catch(e){}
});
Sin embargo:
- Apoyado en la presencia de un elemento de la interfaz de usuario con una clase particular, parece muy frágil, pero lo más importante,
- La actualización visual para el análisis ocurre después de se produce la devolución de llamada
change
.
lo tanto, que en realidad tienen que esperar más de 500 ms (el retardo antes de que el trabajador JavaScript entra en acción):
editor.getSession().on('change',function(){
setTimeout(function(){
// bail out if ACE thinks there's an error
if (edEl.querySelector('div.ace_gutter-cell.ace_error')) return;
try{
eval(editor.getSession().getValue());
}catch(e){}
},550); // Must be longer than timeout delay in javascript_worker.js
});
¿Hay una mejor manera, algo en una API no documentada para el modo de JS, para preguntar si hay algún error o no?
realmente no sé mucho acerca de la ECA, pero que podría explicar por qué está utilizando eval? – hradac
@hradac Mejor que eso, [te mostraré] (http://phrogz.net/JS/d3-playground/) el trabajo (en progreso). – Phrogz
Estoy haciendo algo similar y espero una respuesta también. La evaluación es demasiado costosa para ejecutarla todo el tiempo. – AndrewKS