Я использую редактор ACE для интерактивного редактирования JavaScript. Когда я устанавливаю редактор в режим JavaScript, ACE автоматически определяет, является ли код действительным или нет, с сообщением об ошибке и номером строки, выделенным, когда это не так.
Во время обработчика событий change
я хочу определить, действительно ли ACE считает код действительным или нет, прежде чем я попытаюсь выполнить его eval()
. Единственный способ, которым я думал, что я могу это сделать:
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 an error
if (edEl.querySelector('div.ace_gutter-cell.ace_error')) return;
try{
eval(editor.getSession().getValue());
}catch(e){}
});
Однако:
- Опираясь на присутствие элемента в пользовательском интерфейсе с определенным классом, кажется ужасно хрупким, но что более важно,
- Визуальное обновление для синтаксического анализа происходит после обратного вызова
change
.
Таким образом, мне действительно нужно подождать более 500 мс (задержка перед тем, как работает рабочий JavaScript):
editor.getSession().on('change',function(){
setTimeout(function(){
// bail out if ACE thinks there 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
});
Есть ли лучший способ, что-то в недокументированном API для режима JS, спросить, есть ли какие-либо ошибки или нет?