3

CytoscapeWeb を使用して小さな Web アプリを作成しています。グラフを含む 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;

}

唯一の違いは、2 つの alert() ステートメントがコメント化されていることです。最初のステートメント (alert(filename);) のみを削除すると、アラート ボックスに空の文字列が表示されます。したがって、空白のグラフは、出力変数が正しく設定されていないことが原因であると思われます。

Firefox と Internet Explorer でこれをテストしました。出力変数ではなく文字列「ASDFSADF」を出力する警告ステートメントが 1 つある場合に機能します。ただし興味深いことに、'var jump = "ASDFSADF"' など、alert() ステートメントを使用しないコードは機能しません。

したがって、次の 3 つの可能性があるように思えます。

  • 私が行ったある種の構文またはロジックの間違いがあり、解析された行数が重要になります
  • 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 に答える