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


person Max Bond    schedule 01.07.2012    source источник
comment
Я подозреваю, что предупреждение блокирует выполнение, давая время для завершения ajax. Ajax асинхронный.   -  person pimvdb    schedule 01.07.2012
comment
Переработайте свой код так, чтобы get_network принимал функцию обратного вызова и передал output этой функции обратного вызова внутри вашего обратного вызова AJAX success.   -  person mu is too short    schedule 01.07.2012
comment
Спасибо всем за вашу помощь, это заняло бы у меня целую вечность!   -  person Max Bond    schedule 02.07.2012


Ответы (2)


Выходная переменная не устанавливается во время выполнения предупреждения, поскольку вызов AJAX является асинхронным (A в AJAX означает асинхронный).

Все, что вам нужно сделать после завершения вызова AJAX, должно быть передано в качестве обратного вызова.

Итак, если ваш код выглядит примерно так:

var graph = get_network(filename);
draw(graph);

вам нужно будет изменить get_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 по-прежнему является функцией из первого примера

person Rune FS    schedule 01.07.2012

Оповещения останавливают поток выполнения на время, достаточное для возврата ответа. Если вашему серверу потребовалось 10 секунд, чтобы ответить, и вы закрыли оповещения через 5 секунд, это не сработает.

Функция jQuery ajax не принимает функцию обратного вызова просто для развлечения, чтобы сделать ваш код более уродливым, она использует ее, потому что выполнение является асинхронным, и ответ гарантированно будет доступен только внутри обратного вызова.

Запустите любой код, который вам нужно запустить, который зависит от ответа, внутри функции обратного вызова успеха.

Вы уже сделали это с помощью window.onload = function(){} ‹ -- только код внутри этой функции гарантированно запустится после "загрузки" окна. Код за его пределами просто выполняется сразу последовательно. Сделайте то же самое с аяксом.

person Esailija    schedule 01.07.2012
comment
На самом деле этот код был из учебника, но я понимаю, о чем вы говорите. Я подумал, что странно, что для этого требуется функция обратного вызова, спасибо за разъяснение. - person Max Bond; 02.07.2012