问题 在每个循环中调用Jquery ajax


我在使用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. 

       }
     });

});

干杯。


5652
2017-07-13 13:22


起源



答案:


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

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

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

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


10
2017-07-13 13:24



欢呼帮助,我已经完成了你的建议并改变了我的代码结构,我删除了循环并改为使用递归。现在工作正常。 - DazzledKid


答案:


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

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

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

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


10
2017-07-13 13:24



欢呼帮助,我已经完成了你的建议并改变了我的代码结构,我删除了循环并改为使用递归。现在工作正常。 - DazzledKid


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

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

       }
     });

});

3
2017-07-13 13:34



我试过这个,我明白为什么它非常沮丧。看似将其设置为false会导致我的浏览器冻结,直到收到所有响应并且循环结束。 - DazzledKid
我不确定你期望发生什么。如果您希望脚本暂停并等待响应,那么它将完全暂停并等待。也许你应该解释一下你想要完成什么,因为可能有更好的方法。使用不同的算法可能有更好的方法来实现您想要的最终结果。 - YonahW


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

如果您确定请求必须返回,那么您可以删除“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
2017-07-05 11:06



为什么不在第一个ajax请求返回成功时突破每个循环? - markus


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


0
2017-10-08 13:57