Привет всем! Я использую редактор ACE для интерактивного редактирования JavaScript. Мне нужно определить, считает ли ACE код валидным, прежде чем выполнять его через eval().
Сейчас я делаю так:
editor.getSession().on('change', function() {
setTimeout(function() {
if (!document.querySelector('.ace_error')) {
try {
eval(editor.getValue());
} catch(e) {}
}
}, 600);
});
Но это выглядит ненадежно. Есть ли способ лучше? Может, какой-то API у режима JavaScript в ACE, чтобы проверить наличие ошибок? Буду благодарен за любые идеи!
Для проверки валидности кода в ACE есть более надежные способы. Можно использовать метод editor.getSession().getAnnotations(), который вернет массив ошибок и предупреждений. Примерно так:
editor.getSession().on('change', function() {
var annotations = editor.getSession().getAnnotations();
var hasErrors = annotations.some(a => a.type === 'error');
if (!hasErrors) {
// Код валиден, можно выполнять
}
});
Это будет работать точнее и быстрее, чем проверка DOM-элементов. Плюс позволит различать ошибки и предупреждения.
знаешь, я тоже сталкивался с похожей проблемой. в итоге нашел решение - использовать встроенный валидатор aceeditor. он называется ace.require(“ace/worker/worker_client”). это более надежный способ, чем просто проверять наличие ошибок в интерфейсе.
вот примерный код:
var worker = ace.require("ace/worker/worker_client").get(editor.getSession());
worker.on("error", function(e) {
console.log("ошибка:", e);
});
worker.on("ok", function() {
// код валиден, можно выполнять
});
так ты сможешь отлавливать реальные ошибки в коде, а не просто визуальные. попробуй, должно помочь!
Ребят, а вы не думали использовать esprima для парсинга? Я его недавно попробовал, работает отлично. Просто передаешь код в esprima.parse() и если нет исключений - значит все ок. Плюс можно получить AST для более глубокого анализа. Правда, придется подключить библиотеку, зато надежно и гибко. Как вам такой вариант?