我有一个表单字段,其中包含许多输入文本字段。一些字段需要一些类似的数据,因此我给了它们一个公共类。请求使用 ajax 处理。对于每个输入字段,使用输入字段.each(function()
单独传递请求。下面是一个基本代码;
$('#mybutton').click(function(){
var flag1 = 0;
var flag2 = 0;
$('.input_text_field').each(function(){
var current = $(this);
var curvalue = current.val();
if(curvalue != ""){
$.ajax({
type: 'POST',
url: 'ajaxhandler.php',
data: 'item='+curvalue,
cache: false,
async: false,//would like to remove this
success: function(result) {
if(result == "true"){
flag1++;
}else{
flag2 = 1;
}
}
});
}
});
if(flag2 == 0 && flag1 > 0){ //this happens before the ajax request(s) completes (if asyc:true), I think.
alert(flag1);
}else{
alert("false, "+flag1);
}
});
ajax 回复可以是"真"或"假"。我想计算"真实"回复,如果有任何"错误"回复,我也想设置一个标志。为了实现这一点,我使用了 2 个本地标志(bothe 最初值为 0)、flag1
(用于计算"真实"回复)和 flag2
(以识别是否存在任何虚假回复)。
我想做点什么,如果(flag2 == 0 && flag1 > 0)
.为了使flag1
增量,我设置了async: false
,但我得到了很多反馈,说禁用async
不是一个好的做法,所以我想摆脱它。有没有办法在不禁用async
的情况下实现相同的目标?
现在,我还没有尝试过这段代码,您可能需要对其进行一些调整,但我认为沿着这些思路可以工作:
var getData = function( val ){
return {
$.ajax('ajaxhandler.php', {
data: { value: val },
dataType: 'json'});
}
}
$('#mybutton').click(function(){
var flag1 = 0;
var flag2 = 0, deferreds = [];
$('.input_text_field').each(function(){
var currentVal = $(this).val();
if(!!currentVal){
deferreds.push(getData(curvalue).then(function(resp){
(resp == "true") ? flag1 += 1 : flag2 = 1;
}));
}//End if
}); //End each
$.when.apply(window, deferreds).then(function(){
//put callback code here
if(flag2 == 0 && flag1 > 0){
alert(flag1);
}else{
alert("false, "+flag1);
}
});
});//End click
不知道为什么要单独遍历输入字段和 ajax,而不是序列化表单并一次发送所有内容。但我相信你有一个很好的理由来做你想做的事情。
同样,我还没有尝试过这段代码。我只是在我的手机上写了这个。但从理论上讲,它应该有效。