2013-04-03 110 views
0

這是我的代碼:Ajax請求的循環

for (var i = 0; i < 20; i++) { 
$.ajax({ 
    type: "GET", 
    async: false, 
    url: "/MyController/MyMethod", 
    success: function (data) { 
     if (i == 0) { 
      $('#result_progress').hide(); 
      $('#result_msg').hide(); 
      $('#details').show(); 
     } else if (i == 1) { 
      $.ajax({ 
      type: "GET", 
      async: true, 
      url: "/Import/Finish", 
      success: function (data) { 
        ....       
      });            
     } 
     if (i < 2) { 
      $('#details').html($('#details').html() + 'someText')); 
     }           
    } 
}); 

}

我不想使用異步:因爲我的瀏覽器停止工作錯誤。我會如何解決這個問題?

+0

你不想使用同步請求,但Ajax請求應該還是按順序? –

+0

@FelixKling同步和順序是不一樣的東西 – NimChimpsky

+0

@FelixKling那麼MyMethod有一個輸入參數依賴於我,所以是的。 –

回答

0

以下是我固定它:

function run(i, howManyToRun, start) { 
    if(i >= howManyToRun) return; 

    $.ajax({ 
     type: "GET", 
     async: false, 
     url: "/MyController/MyMethod", 
     success: function (data) {   
      .... 
      run(++i, howManyToRun, start); 
      ....          
     } 
    }); 
} 
0

您的問題是i具有執行回調時的循環結束值。

的標準溶液,以解決這個問題是增加一箇中間立即調用的函數,以保護的i值:

for (var i = 0; i < 20; i++) { 
    (function(i){ 
     ... your code 
    })(i); 
} 

給函數的調用創建一個範圍,其中i是一個不同的變量。

+0

你是對的,但這似乎不是OP所要求的;) –

+0

@FelixKling我不確定。我不會像你一樣閱讀這個問題(我見過你的其他評論)。順便說一句,我沒有找到通常的問題,我會關閉重複。我相信你有一個鏈接... –

+0

哦,現在我明白了......你認爲OP由於'i'使用'async:false'。也許你應該明確提到將它設置爲'false'不再需要。如果OP想按順序運行請求,我會搜索一些延遲對象解決方案... –

0

我想你應該有一些封閉做到這一點:

function makeReq(n){ 
    return function(){ 
     $.ajax({ 
     type: "GET", 
     async: true, 
     url: "/MyController/MyMethod", 
     success: function (data) { 
      if (n == 0) { 
       $('#result_progress').hide(); 
       $('#result_msg').hide(); 
       $('#details').show(); 
      } else if (n == 1) { 
       $.ajax({ 
       type: "GET", 
       async: true, 
       url: "/Import/Finish", 
       success: function (data) { 
        ....       
       });            
      } 
      if (n < 2) { 
       $('#details').html($('#details').html() + 'someText')); 
      }           
     } 
    }); 
    } 
} 

for (var i = 0; i < 20; i++) { 
    makeReq(i); 
} 

這個問題可以通過創建一個函數和調用它的每次循環,同時通過我來解決;調用函數將形成一個全新的執行上下文,其中i的值保留並可在該上下文中以任何方式使用。

+0

@Jsi makeReq已輸入,但MyMethod未被調用,甚至沒有調用。 –