2014-09-22 62 views
1

我的jQuery似乎停止,直到ajax請求已加載。 這裏有什麼問題我認爲ajax是異步的?

代碼:

$('div').each(function(){ 

    if($(this).attr('id')){ 
     var that = this; 
     $.post('application/views/dashboard/dashboard.php?component='+$(this).attr('id')+"&settingid="+settingId, function(response){ 
      $(that).html(response); 
      $(window).trigger('resize'); 
     }); 
     settingId++; 
    } 
}); 
+0

還有就是要同時有數量限制調用。你嘗試發送多少個? – 2014-09-22 11:28:43

+0

@TrueBlueAussie 4,但第二個是較慢的呼叫,然後它不會執行呼叫3和4 – 2014-09-22 11:30:18

+0

您是否需要並行或順序運行,或者「不關心,只要告訴我他們何時完成」? – 2014-09-22 11:35:46

回答

1

$.when將等待所有的異步調用完成(順序和時間不重要),然後可以在最後執行一個額外的操作(除了單獨的操作)。您將需要使用$.ajax,而不是簡單的$.post

var requests = []; 
$('div').each(function() { 
    if ($(this).attr('id')) { 
     var that = this; 
     requests.push($.ajax({ 
      url: 'application/views/dashboard/dashboard.php?component=' + $(this).attr('id') + "&settingid=" + settingId, 
      type: "post", 
      success: function (response) { 
       $(that).html(response); 
      } 
     })); 
    }); 
    settingId++; 
}); 
$when(requests).then(function() { 
    $(window).trigger('resize'); 
}); 

$.when作品採取的jQuery承諾的陣列(在這種情況下,阿賈克斯的承諾),並等待他們都成功了。

對上述代碼中的任何拼寫錯誤表示歉意。我只寫是直接到答案:)

當然你也可以從這個simplfy代碼:

$('div').each(function() { 
    if ($(this).attr('id')) { 

這樣:

$('div[id]').each(function() { 
+0

暫時解決了一些{}()錯誤,然後我會試一試 – 2014-09-22 11:46:20

+0

如果請求2正在加載,則3仍然會執行相同的結果。如果2已經加載了3並且4將會執行。 – 2014-09-22 11:49:17

+0

您的瀏覽器一次只處理2個請求(最大),因此這是預期的。 4個結果會發生什麼? – 2014-09-22 11:51:49

0

看看herehere。這是兩種不同的解決方案。

這只是重寫所有的迴應。嘗試將它們存儲在數組中,或使用async:false,這會使所有請求都在隊列中工作。

+3

永遠不要建議'async:false' as一個辦法!這是一個非常糟糕的主意,會導致比解決問題更多的問題。 – 2014-09-22 11:34:35

+0

我同意這一點,但是是可能的解決方案之一,有時它的工作。 – aleha 2014-09-22 11:56:25

+0

總是最好找出問題的實際原因。 *任何*都是比'async:false'更好的解決方案。儘管你第一個鏈接是一個很好的答案。 – 2014-09-22 13:06:40

0

使用$ .ajax()而不是$ .post。因爲它有很多可配置的參數。 在這裏你可以使用Promise模式。