2011-05-16 34 views
1

これで、ajaxを通過した後systemPathのグローバル変数を変更することができないようです。これはAjax内部で動作しますが、 ajaxの外部で変数を更新しました。基本的に私はxmlから一連のパスを作成し、それらを使ってテーブルを生成できる他のxmlファイルを探し出そうとしています。グローバル変数はAJAXの成功関数内から更新されません

ここで何が起こっているか知っていますか?変数が設定される前にajaxが実行されるので、なぜajaxの後に配列の長さが0になるのですか?

var systemPath = new Array(); 
var techDigestArr = new Array(); 
var addToArray = function(thisarray, toPush){ 
    thisarray.push(toPush); 
} 

$.ajax({ 
    url: fullPath+"technical/systems/systems.xml", 
    dataType: ($.browser.msie) ? "text" : "xml", 
    success: function(data){ 
          var xml;  
          if (typeof data == "string") { 
           xml = new ActiveXObject("Microsoft.XMLDOM"); 
           xml.async = false; 
           xml.loadXML(data); 
          } else { 
           xml = data; 
          } 
          $(xml).find("system").each(function(){ 
           var urlString = fullPath + "technical/system_" + $(this).attr("id") + "/" + $(this).attr("id") + "tech-digest.xml <br />"; 
           //alert(urlString); 
          $("#td-articles").append(systemPath.length + urlString); 
           addToArray(systemPath,urlString); 
           //systemPath.push(urlString); 
          }); 
         $("#msg-output").append("total - " +systemPath.length);//Returns 48 

        },//END SUCCSESS 
    error: function(){ 
     alert("Sorry - "); 
     history.go(-1); 
    } 
});//END AJAX CALL 
    $(document).ready(function(){ 
     //$("#msg-output").append("total - " + systemPath.length); Returns 0 
    }); 

答えて

1

AJAXは非同期に実行されます。コード内でこのような順序で実行されます。

  1. もの$.ajax()
  2. $.ajax()$.ajax()
  3. successコールバック

後のAJAX呼び出し(応答を待っている間、それは残りのコードを実行し続けます)

  • ものを開始する前にコールの速さによって3と4が逆の順序で発生する可能性があることに注意してください(ここでは該当しません)

    したがって、$(document).ready()が実行されると、ajax呼び出しがまだ返されていない可能性があります。そのため、成功のコールバックのコードは実行する機会がありませんでした。あなたが運が良ければ速い接続をしているかもしれないが、おそらく応答は文書の準備ができる前に来るだろうが、それはありそうもない。アヤックスから生成され、その後もされた配列にアイテムを格納するための最良の方法であるもの、それでは

    $(document).ready(function(){ 
        setTimeout(function(){ 
        $("#msg-output").append("total - " + systemPath.length); 
        //if the delay set below is more than the time between the ajax request and the server response than this will print the correct value 
        },2000); 
    }); 
    
  • +0

    ただ、あなたはグローバル変数を使用すると、タイムアウトを設定することができます更新されることがわかりますページの後半でそれらを使用することができますか? –

    +0

    成功したコールバックからのみアクセスするのが理想的です。しかし、ユーザーのやりとり(クリックなど)でそれらにアクセスする必要がある場合は、現在行っているようにグローバルに保存することができます。これに対処するには、データが受信されたときにのみクリックハンドラを設定し、その時点までリンクに何もしないでください。 –

    +0

    [jsFiddle example](http://jsfiddle.net/danmana/y6XgY/)あなたの状況の、より良い流れを理解することができます –

    関連する問題