我试图找到一种方法来一个接一个地运行每个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";
答案 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