2013-04-03 68 views
0

一段時間後,這是我的代碼:瀏覽器停止工作在同步Ajax調用for循環

for (var i = 0; i < 2; 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')); 
      }           
     } 
    }); 
} 

在這個例子中迭代雖小,但我做了這裏的方法更簡單。我知道我可以使用開關,但那不是重點。實際上它有更多的循環。沒關係,這個錯誤也發生在這個代碼上。

下面是發生了什麼: 如果我把斷點放入第一個ajax調用的成功部分,並且在Chrome中調試時,eveything可以正常工作。 下面是我的意思是工作得很好:在方法進入第一次成功之後,我想隱藏一些div並顯示ajax調用的結果。第二次輸入第一個成功時,另一個字符串將被添加到前一個。 最後,當輸入第二個成功部分時,該消息將被隱藏,並顯示一些數據。

這就是發生了什麼事情: 一切都很好,直到MyMethod被調用。當它被調用時,瀏覽器停止工作。如果我按下鼠標左鍵,則什麼都不會發生。當最後一次調用MyMethod時,瀏覽器工作正常,我可以快速瀏覽消息,然後顯示第二個Ajax調用的數據。而且我很快看到的消息是從MyMethod的所有調用中發出的全部消息,這不應該發生。

我希望它能顯示整個for循環和Finish方法之前。它不應該是相同的信息。每次調用MyMethod的Ajax應該會變得更大。

+0

您爲什麼首先使用同步呼叫? – Chad

+0

你期望瀏覽器如何處理循環中的同步ajax調用?與alert相同,爲了繼續腳本執行,瀏覽器必須先等待ajax調用完成。 – Corneliu

+0

@Chad因爲ajax調用處於for循環。 –

回答

2

您可以使用「遞歸」函數來幫助您使用異步調用來控制流。與其同步運行它們,您可以異步運行它們,然後在下一個時間再次調用該函數。

喜歡的東西:

function doCall(i) { 
    if(i > howManyToRun) return; 

    $.ajax({ 
     //... 
     succcess: function(data) { 
      //... 
      //time to start the next one 
      doCall(++i); 
     }, 
     error: function() { 
      //call the next one on error? 
      doCallI(++i); 
     } 
    }) 
} 

這樣,他們異步運行,而他們都呼籲不要阻止一切;但仍然連續運行。