Как проверить корректность JavaScript-кода в обработчике изменений редактора ACE?

Привет всем! Я использую редактор 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 для более глубокого анализа. Правда, придется подключить библиотеку, зато надежно и гибко. Как вам такой вариант?