2010-08-17 75 views
0

我有這個小jquery腳本,如果我刪除'async:false'部分不起作用...並且我不明白爲什麼(alert()部分只是爲了檢查它是否有效)。我的猜測是它會異步工作,但事實並非如此。有人可以向我解釋爲什麼?我應該改變什麼才能使它成爲異步?jQuery腳本應該運行異步,但只能同步?爲什麼?

$(document).ready(function(){ 
    var artistName = new Array(); 
    var artistPlaycount = new Array(); 

    $('#inputForm').submit(function(){ 
     var userName = $('#username').attr('value'); 
     var amount = $('#amount').attr('value'); 

     userName = "someUsername"; 

     $.ajax({ 
      type: "POST", 
      url: "prepXML.php", 
      data: "method=getartists&user="+userName+"&amount="+amount, 
      dataType: "xml", 
      async:false, 
      success: function(xml){ 
       var i = 0; 
       $("artist",xml).each(function(){ 
        artistName[i] = $(this).find("name").text(); 
        artistPlaycount[i] = $(this).find("playcount").text(); 
        i++; 
       }); 
      } 
     });   
    }); 

    alert(artistName[2]); //or any other iteration number 
}); 

謝謝

+0

刪除 「異步:假」,使之同步。你的問題仍然不清楚。 – Chris 2010-08-17 17:55:02

回答

3

要做到這一點異步需要提醒進入回調並刪除async選項,如:

$.ajax({ 
     type: "POST", 
     url: "prepXML.php", 
     data: "method=getartists&user="+userName+"&amount="+amount, 
     dataType: "xml", 
     success: function(xml){ 
      $("artist",xml).each(function(i){ 
       artistName[i] = $(this).find("name").text(); 
       artistPlaycount[i] = $(this).find("playcount").text(); 
      }); 
      alert(artistName[2]); 
     } 
    }); 

否則該success功能填充陣列發生警報確實...所以你想要的不是那麼完美。直到請求從服務器返回,success處理程序才執行。

而且,在.each()回調的第一個參數是索引,你可以使用它,沒有必要保持自己的遞增變量:)

0

因爲回調的alert解僱後它不工作。將alert置於回調中。

0

您需要將警報轉移到您的成功處理程序中。

alert(artistName[2]); //or any other iteration number 

應該在您通過xml循環之後進行。

,所以你應該有:

success: function(xml){ 
      var i = 0; 
      $("artist",xml).each(function(){ 
       artistName[i] = $(this).find("name").text(); 
       artistPlaycount[i] = $(this).find("playcount").text(); 
       i++; 
      }); 
      alert(artistName[2]); //or any other iteration number 
     }