2011-06-16 84 views
2

我需要計算jQuery ajax調用在列表中的每個項目上成功執行的次數。jQuery:在每個項目中成功執行jQuery ajax調用的次數.each()

我從這裏開始,但隨後意識到了這一點並不會因爲AJAX的「異步」部分的工作:

var numSuccessfullUpdates = 0; 

$('#saveMyListItems').click(function (event) { 
    event.preventDefault(); 

    $('ul#myList li').each(function() { 
     $.ajax({ 
      url: '[my_url]', 
      type: "POST", 
      data: { 
       // [data block here, not relevant to question] 
      }, 
      success: function() { 
       numSuccessfullUpdates++; 
      } 
     }); 
    }); 
    if (successfullUpdates > 0){ 
     alert(numSuccessfullUpdates); 
    } 
}); 

有什麼建議?

+0

您是否意識到或測試過? – 2011-06-16 07:10:08

+0

你想等到他們全部完成嗎?在超時時間到期之前? – justis 2011-06-16 07:10:17

+0

@編碼怪胎:我測試過,然後實現。 – Faust 2011-06-16 07:11:41

回答

2

您可以使用complete AJAX處理程序並統計狀態結果,直到結果總數等於請求總數。以下是示例代碼,also available as a jsFiddle

$('#saveMyListItems').click(function (event) { 
    event.preventDefault(); 

    var ajaxCounter = { 
     goal: $('ul#myList li').length, 
     total: 0, 
     success: 0, 
     notmodified: 0, 
     error: 0, 
     timeout: 0, 
     abort: 0, 
     parsererror: 0 
    } 

    $('ul#myList li').each(function() { 
     $.ajax({ 
      url: '/echo/html', 
      type: "POST", 
      timeout: 1500, 
      data: { 
       html: "foobar", 
       delay: Math.floor(Math.random() * 5) 
      }, 
      complete: function (jqXHR, textStatus) { 
       ajaxCounter.total++ 
       ajaxCounter[textStatus]++; 
       if (ajaxCounter.total >= ajaxCounter.goal) { 
        alert(ajaxCounter.success + ' out of ' + ajaxCounter.total); 
       } 
      }, 
     }); 
    }); 
}); 
+0

請注意,隨機延遲有時會超時而不是成功。但它似乎只適用於第一個請求,但?我有點新使用jsFiddle來測試AJAX。 – justis 2011-06-16 07:44:22

+0

我贊同@ coding-freak關於'$ .when()'的答案,因爲這是一個更加優雅的解決方案。因爲我已經基本完成了上面的例子,但我認爲你可能會喜歡另一種解決方案。 – justis 2011-06-16 07:46:01

+0

也許編碼怪胎的解決方案更優雅 - 我贊成它,因爲這是一件很好的事情要知道 - 但你是我的工作。 – Faust 2011-06-16 08:51:19

0

您還需要計算所有響應,並在達到總數或合理超時已過期時發出警報。

3

您可以嘗試在jQuery的1.5 +提供的新when()then()功能,

$.when($.ajax("/page1.php"), $.ajax("/page2.php")).then(myFunc, myFailure); 

這裏執行的函數myFunc的當兩個Ajax請求是成功的,或者myFailure如果任何一個有錯誤。

因此,通過上述函數,您可以檢查是否所有的ajax請求都成功完成,如果myFunc函數運行。

+0

太棒了! '$ .when()'特性非常強大。謝謝你告訴我們。 – justis 2011-06-16 07:44:58

+0

@justis:welcome .... – 2011-06-16 07:46:16

+0

好吧,我已經包裝$('ul#myList li')。each(...);在$ .when()中設置2個函數來成功和失敗。儘管如此,警報呈現爲0.這是一個可變範圍問題嗎? – Faust 2011-06-16 08:12:59