如何基于 ajax 回复设置计数器和标志,而不是禁用异步



我有一个表单字段,其中包含许多输入文本字段。一些字段需要一些类似的数据,因此我给了它们一个公共类。请求使用 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,而不是序列化表单并一次发送所有内容。但我相信你有一个很好的理由来做你想做的事情。

同样,我还没有尝试过这段代码。我只是在我的手机上写了这个。但从理论上讲,它应该有效。

最新更新