2015-02-06 113 views
0

我正在開發一個需要以順序方式處理ajax調用的項目。我的代碼是一樣的東西:順序執行js

for(var j=0; j<3;j++) { 
       $.ajax({ 
        url:url[j], 
        async:false 
       }).done(function(result){ 
        var data = result.data; 
        for(var i=0; i < data.length;i++){ 
         analyses += "<div><div id=\"" + data[i] + "\" class=\"module\">"; 
         analyses += "<br/>Analysis : " + data[i] + "<br/>"; 
         analyses += "</div></div>"; 
         $("#analysesPlaceHolder").html(analyses); 
        } 
       }); 

      } 

然而,現在它只是隨機選擇列表中的網址(有時是第一次,有時則不然)。如何使執行順序,以便代碼首先執行第一個Ajax調用,然後第二個等。

+0

因爲你指定'async:false',你的'$ .ajax'調用是同步的,而且你正在從一個'array'中取得你正在循環的url ......可能這個'random'問題是在你創建'url'數組的地方。 – albciff 2015-02-06 11:37:07

+0

也許'$ .when'就是你想要的......看看這裏http://api.jquery.com/jQuery.when/ – 2015-02-06 11:48:02

回答

0

我不會建議在循環中使用ajax調用。

這裏是一個更好的辦法,這在增加Ajax回調的數量,然後觸發下一個Ajax請求:

var urlCount = 0; 

var makeAjaxCall = function(count) { 
    $.ajax({ 
     url:url[count], 
    }).done(function(result){ 
     var data = result.data; 
     for(var i=0; i < data.length;i++){ 
      analyses += "<div><div id=\"" + data[i] + "\" class=\"module\">"; 
      analyses += "<br/>Analysis : " + data[i] + "<br/>"; 
      analyses += "</div></div>"; 
      $("#analysesPlaceHolder").html(analyses); 
     } 

     urlCount++; 
     if (urlCount < 3) { 
      makeAjaxCall(urlCount); 
     } 
    }); 
} 

makeAjaxCall(urlCount); 

你也可以使用連鎖承諾AJAX調用,如上面的註釋說明。