Странная ошибка 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.

Другие вопросы по тегам