Странная ошибка JavaScript, вызванная синтаксисом, Cytoscape Web или jQuery
Я пишу небольшое веб-приложение с использованием CytoscapeWeb. Он загружает файл XML, содержащий график, и отображает его. Я столкнулся с проблемой, когда он не отображает график (вместо него отображается пустой график), даже если файл известен как звуковой. После нескольких дней бесполезной работы с моим кодом я начал модифицировать пример кода, представленного в руководстве, чтобы воспроизвести проблему.
Этот код работает:
function get_network(filename)
{
var output = "";
$.ajax({url: filename, type: "GET", dataType: "text", success: function(result) { output = result; } });
alert(filename);
alert(output);
return output;
}
И этот код не:
function get_network(filename)
{
var output = "";
$.ajax({url: filename, type: "GET", dataType: "text", success: function(result) { output = result; } });
//alert(filename);
//alert(output);
return output;
}
Разница лишь в том, что два оператора alert() закомментированы. Когда удаляется только первый оператор (alert(filename);), в окне предупреждения отображается пустая строка. Таким образом, может показаться, что пустой график вызван проблемой, при которой выходная переменная установлена неправильно.
Я проверял это в Firefox и Internet Explorer. Это работает, если есть один оператор оповещения, который печатает строку "ASDFSADF", а не выходную переменную. Интересно, однако, что код, который не использует оператор alert(), такой как 'var junk = "ASDFSADF"', не работает.
Поэтому мне кажется, что есть три варианта:
- Я допустил какую-то синтаксическую или логическую ошибку, из-за которой количество анализируемых строк значительно
- Cytoscape Web вызывает проблему, я не могу себе представить
- JQuery не вызывает функцию успеха
Однако я начинаю подозревать, что эта проблема выходит за рамки моей компетенции и вызвана чем-то, что я не рассматривал.
Однако, где эта синтаксическая ошибка могла быть за мной. Я искал высоко и низко. Кто-нибудь видел что-то подобное или иначе знает, что происходит?
Большое спасибо за вашу помощь.
Полный код: http://pastebin.com/rvcV3LFL
Файл XML: http://pastebin.com/HCyuKQnx
2 ответа
Выходная переменная не устанавливается во время выполнения предупреждения, потому что вызов AJAX является асинхронным (A в AJAX для асинхронного).
Все, что вам нужно сделать после завершения вызова AJAX, нужно будет передать как обратный вызов.
Так что, если ваш код выглядит примерно так:
var graph = get_network(filename);
draw(graph);
вам нужно изменить ge t_network на:
function get_network(filename,callback)
{
var output = "";
$.ajax({url: filename, type: "GET", dataType: "text", success: function(result) {
callback(result);
}
и тогда вызывающий код будет
get_network(filename,draw);
где draw - это функция из первого примера
Предупреждения останавливают поток выполнения достаточно долго, чтобы ответ вернулся. Если для ответа вашего сервера потребовалось 10 секунд, а оповещения были закрыты через 5 секунд, это не сработает.
Ajax-функция jQuery не берет функцию обратного вызова просто для забавы, чтобы сделать ваш код более уродливым, она принимает это потому, что выполнение асинхронно и ответ гарантированно будет доступен только внутри обратного вызова.
Запустите любой необходимый вам код, который зависит от ответа, внутри функции обратного вызова success.
Вы уже сделали это с window.onload = function(){}
<- только код внутри этой функции гарантированно будет запущен после того, как окно "загрузится". Код за его пределами выполняется сразу же последовательно. Сделайте то же самое с ajax.