我在使用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.
}
});
});
干杯。
你可以使用 async
此选项使每个请求同步(=在每个请求完成之前暂停脚本执行):
异步
默认情况下,所有请求都是异步发送的(默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,在请求处于活动状态时禁用任何操作。
但是,正如文档已经说过的那样,这是非常气馁的,因为如果请求挂起或超时,它可能会冻结浏览器。
如果可能的话,最好以一种可以使用经典回调函数的方式更改代码的体系结构。
你可以使用 async
此选项使每个请求同步(=在每个请求完成之前暂停脚本执行):
异步
默认情况下,所有请求都是异步发送的(默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,在请求处于活动状态时禁用任何操作。
但是,正如文档已经说过的那样,这是非常气馁的,因为如果请求挂起或超时,它可能会冻结浏览器。
如果可能的话,最好以一种可以使用经典回调函数的方式更改代码的体系结构。
佩卡有正确的答案。您只需编辑脚本,如下所示。
$(".element").each(function() {
var id= $(this).find(('txtId').val();
$.ajax({
type: "POST",
async: false,
url: "/Handlers/Handler.ashx",
data: "ID=" + id,
success: function(xml){
}
});
});
我很高兴地说有一种方式......但它有点令人讨厌。
如果您确定请求必须返回,那么您可以删除“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);
}
});
});
}
}