2010-07-13 60 views
10

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

赫斯是一个简单的例子:

$(".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. 

     } 
    }); 

}); 

干杯。

回答

10

您可以使用async选项这使每个请求同步(=暂停脚本执行,直到每个请求完成):

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

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

如果可能的话,最好改变代码的体系结构,使其能够与传统的回调函数一起工作。

+4

干杯的帮助,我已经走了你的建议,并改变了我的代码的结构,我已经删除了循环,并使用递归。现在可以工作了。 – DazzledKid 2010-07-14 08:15:44

2

Pekka有正确的答案。你只需要编辑你的脚本如下。

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

     } 
    }); 

}); 
+0

我试过这个,我可以看到它为什么非常灰心。貌似设置为false会导致我的浏览器冻结,直到收到所有响应并且循环结束。 – DazzledKid 2010-07-13 13:41:35

+0

我不确定你期望发生什么。如果您希望脚本暂停并等待响应,那么它会完成暂停和等待。 也许你应该解释一下你正在寻找的东西,因为这可能有更好的方法。用一种不同的算法可能有更好的方法来达到你想要的最终结果。 – YonahW 2010-07-13 14:26:57

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); 
      } 
     }); 

    }); 
} 
} 
+0

当第一个Ajax请求返回成功时,为什么不直接跳出每个循环? – markus 2012-11-17 23:08:47