2010-12-11 52 views
3

我有一個網絡應用程序,使得大量的$.post()請求。服務器必須按照它們創建的順序接收這些信息。爲了保證這一點,我首先想到我會創建自己的隊列,並在前一隊隊列完成之後出隊並開始下一個Ajax調用。與jQuery同步的Ajax

然後我看到有一個async:false選項,您可以使用$.ajax()

我已經更改了所有要求使用$.ajax({ async: false, ... })的請求,但是當我在Firebug中監視它們時,請求不會逐個發送,每次下一個請求在最後一次收到響應後都會被觸發。

async是什麼假設呢?我如何管我的Ajax,以便一次執行一個,下一個在最後一個完成(接收到響應)時觸發?

回答

7

而不是使用async:false,您可以創建一個從回調中遞歸調用的函數。

function sendReq(arr) { 
    var current = arr.shift(); // Remove the first item from the Array. 
    $.ajax({ 
     url: current.url,  // Use the url from the first item. 
     success: function(dat) { 
      current.func(dat); // Call the function of the first item. 
      if(arr.length)  // If there are items left in the Array, 
       sendReq(arr); //  make a recursive call, sending 
     }       //  the remainder of the array. 
    }); 
} 

// Ordered collection of requests to be made. 
var req_set = [ 
    {url:'someurl', func:function(dat) { /*do something with dat*/ }}, 
    {url:'anotherurl', func:function(dat) { /*do something with dat*/ }}, 
    {url:'someother', func:function(dat) { /*do something with dat*/ }} 
]; 
// Start the first call, sending the entire set. 
sendReq(req_set); 

所以基本上:

  • 製作包含用於請求所需的元素對象的數組。
  • 製作一個接受數組的函數。
  • 該函數從數組中刪除第一個項目,並使用該對象填充請求屬性。
  • 在回調中,在調用該項目的函數之後,對函數進行遞歸調用,傳遞數組的其餘部分。
  • 這將繼續遞歸調用,直到Array爲空。