在每个循环中调用Jquery ajax

时间:2010-07-13 13:22:34

标签: jquery each

我在使用jquery .each()和.ajax()函数时遇到了问题。我正在使用.each()循环遍历5个元素,并为每个元素执行.ajax()调用。我的问题是,我只希望在从每个ajax请求收到响应时继续循环。目前,所有5个元素都在循环,5个ajax请求正在进行,然后返回5个响应。

她的一个简单例子:

$(".element").each(function() {
    var id= $(this).find(('txtId').val();
    $.ajax({
       type: "POST",
       url: "/Handlers/Handler.ashx",
       data: "ID=" + id,
       success: function(xml){

         // I would like the each() loop to pause until this is hit, 
         // and some additional logic can be performed. 

       }
     });

});

干杯。

5 个答案:

答案 0 :(得分:10)

您可以使用async选项使每个请求同步(=在每个请求完成之前暂停脚本执行):

  

<强>异步   默认情况下,所有请求都是异步发送的(默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。

但是,正如文档已经说过的那样,这是非常气馁的,因为如果请求挂起或超时,它可能会冻结浏览器。

如果可能的话,最好以可以使用经典回调函数的方式更改代码的体系结构。

答案 1 :(得分:4)

佩卡有正确的答案。您只需编辑脚本,如下所示。

$(".element").each(function() {
    var id= $(this).find(('txtId').val();
    $.ajax({
       type: "POST",
       async: false,
       url: "/Handlers/Handler.ashx",
       data: "ID=" + id,
       success: function(xml){

       }
     });

});

答案 2 :(得分:0)

我很高兴地说有一种方式......但这有点令人讨厌。

如果您确定请求必须提供回复,那么您可以删除“tryIteration”部分。

$(document).ready(function() {

        loop(".buttonsPromotion", 0);

});

function loop(elements, tryIteration) {
//HOW MANY TRIES UNTIL WE STOP CHECKING
if(tryIteration<7){

    $(elements).each(function() {            
        var actuel = $(this);
        $.ajax({
           url: "write your link here",
           data: {},
           dataType: 'json',
           async: true,
           success: function(data){
               //HERE WE KNOW THE AJAX REQUEST WENT OK
               actuel.addClass('AjaxOK');    
           },
           error:function(thrownError){
                console.log(thrownError);
                //WE MAKE ANOTHER EACH ON ALL ELEMENT THAT WENT BAD
                var elemToRetry = actuel.not('AjaxOK');
                loop(elemToRetry, ++tryIteration);
            }
         });

    });
}
}

答案 3 :(得分:0)

您可以使用jquery延迟和promise函数来检查异步调用是否成功。 http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/

答案 4 :(得分:0)

虽然已经晚了,但我为此使用了一个解决方法 我创建了一个函数来通过传递元素来处理 ajax 请求

A <- spMatrix(ncol = length(unique(food_prefs$person)),
              nrow = length(unique(food_prefs$food)),
              j = as.numeric(factor(food_prefs$person)),
              i = as.numeric(factor(food_prefs$food)),
              x = rep(1, nrow(food_prefs)))
rownames(A) <- levels(factor(food_prefs$food))
colnames(A) <- levels(factor(food_prefs$person))

adj <- A %*% t(A)
food_pairs <- data.frame(food1=rownames(adj)[row(adj)],food2=colnames(adj)[col(adj)],num_joint=as.numeric(adj))
food_pairs <- food_pairs[food_pairs$food1 != food_pairs$food2, ]
head(food_pairs)
# food1 food2 num_joint
# 2   F10    F1        23
# 3  F100    F1        26
# 4 F1000    F1        25
# 5 F1001    F1        19
# 6 F1002    F1        27
# 7 F1003    F1        34
function ajax_request(element){
    var id = element.find('.txtId').val();
    console.log(id);
    $.ajax({
        type: "POST",
        url: "/Handlers/Handler.ashx",
        data: "ID=" + id,
        success: function(xml){
            console.log(xml);
        }
     });
}

$(".element").each(function() {
    // run the ajax function for current element
    ajax_request($(this));
});

希望它可以帮助任何人做类似的事情