在.each循环中一个接一个地运行Ajax请求

时间:2016-07-01 07:12:12

标签: jquery ajax

我试图找到一种方法来一个接一个地运行每个Ajax发布请求,但在运行下一个之前等待事先完成。我已经尝试了几种方法无济于事,所以我已经将它剥离回基础知识,我想知道最好的方法(以及一种有效的方法)就是这样。

当它们像现在一样运行时,一些请求永远不能通过,因为它似乎被下一个请求打断了。

$('.element').each(function() {
        e_id = $(this).attr('data-id');
        $.ajax({
            url: '/?cart-add=' + e_id +'&quantity=1',
            type: 'POST'
        });
    });
)};

然后,当完全完成后,我重定向到另一个正常工作的页面,但上述请求是一个问题,因为并非所有项目都显示,因为它经历了每次迭代,它将id记录到控制台,这是如预期的那样。

window.location.href = "http://stackoverflow.com";

2 个答案:

答案 0 :(得分:2)

这些Ajax请求以异步方式运行,以改善用户体验。

因此,您可能想要做的只是在前一个Ajax请求完成后调用下一个Ajax请求。

您可以在"成功"中指定功能。 ajax调用的选项。并采用不同的迭代方式:

var elementArray;
function callingFunction()
{
    elementArray = new Array();
    $(".element").each(function () {
        elementArray.push($(this));
    });
    doAjax(0);

}


function doAjax(arrCount) 
{
    //USE arrCount to access your data
    var e_id = elementArray[arrCount].attr("data-id");
    $.ajax({
        url: "...",
        type:"POST",
        success: function () {
            arrCount++;
            if (arrCount < elementArray.length)
            {
                doAjax(arrCount);
            }
            else
            {
                window.location.href = "......";
            }              
        }
    });
}

解释

将所有元素放在一个数组(全局数组)中,以零值启动doAjax函数。 (您应该构建逻辑以检查是否存在数组元素)

当ajax函数完成时,它会检查是否有更多项要发送,并使用递增的计数器再次调用doAjax。

如果没有更多元素,则会进行重定向。

值得注意的是,你宁愿用JSON或其他东西做一个批量帖子,而不是做很多小帖子。

希望它有所帮助。快乐的编码。

答案 1 :(得分:1)

您还可以在ajax选项对象中使用async: false

小提琴: jsfiddle.net/pleinx/nhspycf0/

如果出现故障(没有数据标识或请求)将停止循环。

另一种方法已经很好地解释了用户Terrance00