3

我正在使用 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

4

2 回答 2

4

执行警报时未设置输出变量,因为 AJAX 调用是异步的(AJAX 中的 A 表示异步)。

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 仍然是第一个示例中的函数

于 2012-07-01T19:02:05.620 回答
3

警报停止执行线程足够长的时间以使响应返回。如果您的服务器需要 10 秒来响应,而您在 5 秒后关闭警报,则它将无法正常工作。

jQuery ajax 函数并没有仅仅为了好玩而使用回调函数来使您的代码更丑陋,它之所以使用它是因为执行是异步的,并且响应仅保证在回调中可用。

在成功回调函数中运行您需要运行的任何代码,这取决于响应。

您已经使用window.onload = function(){}< 完成了此操作——只有该函数内的代码才能保证在窗口“加载”后运行。它外面的代码直接按顺序执行。对 ajax 做同样的事情。

于 2012-07-01T19:04:37.103 回答