2009-06-06 69 views
2

我想在jQuery中創建X個Ajax請求,並將json響應添加到數組中。 當所有的Ajax請求完成後,我想執行一些代碼。有沒有解決這個問題的好方法?多個json請求的回調

回答

1

此代碼應該做你想做的,所有jQuery風格。基本上它使用一些遞歸來完成它。將選項傳遞給loadmultiples函數以設置您想要執行的操作,並將JSON響應壓入數組。如果您想將JSON響應合併到單個結構中,您可以輕鬆更改它,但我不確定這是否是您想要的。

var loadmultiples = function(options) {  

    var settings = $.extend({ 

     //set the url to get 
     url : '/response.json', 

     //this function is called when everything is done 
     callback : function() {}, 

     //set this option to define how many loads to do 
     numbertodo : 10, 

     //these two are just used for 
     //storing data while we recurse, 
     //and keeping track of the current position 
     //however you can change them if you want to start 
     //from a different point, or have existing data 
     numberdone : 0, 
     data : [] 
    }, options || {}); 

    //load the json, passing up the current 'number' 
    //of the content to load 
    $.ajax({ 
     url : settings.url, 
     data : { 'number' : settings.numberdone }, 
     dataType: 'json',   
     success: function(result) {    

      //add the response to the data 
      settings.data.push(result); 

      //increment the counter of how many files have been done 
      settings.numberdone++; 

      // 
      if(settings.numberdone < settings.numbertoexecute) { 
       loadmultiples(settings); 
      } else { 
       settings.callback(settings.data); 
      } 

     }   
    }); 

} 

//so now we can call it... 
loadmultiples({ 
    callback: function(data) { 
     //this function will get called when all the data calls have been 
     //completed, and the resulting data is in the data parameter 

    } 
}); 
+0

謝謝!我想從不同的URL加載JSON,但是你的代碼可以很容易地修改來做到這一點。 – gustavlarson 2009-06-06 14:16:10

2

除了對請求進行計數並在代碼中手動計算它們之外,我不知道任何其他方法。一旦他們全部回來並佔了上風,執行你的主回調。

0

對於每個Ajax響應,我會做:

for(var k in json) 
    someArray[k]=json[k]; 

但我不知道如何看您的JSON數據。

0

我通過發射一串Ajax請求,然後遞減計數器作爲他們在最近做了這個。

它工作得很好,但我最終從一堆小AJAX的改變我的代碼請求一次向服務器請求所有內容。更少的請求和更少的開銷,以及更強大的功能。

除非你有很好的理由來提出個別請求(有些請求可能很快,有些請求很慢,並且可以在片段進入時提供一些有意義的信息顯示),我會把它們全部結合在一起(假設您可以修改服務器代碼或添加新的服務器代碼)。