2011-06-16 90 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