如何根据ajax回复设置计数器和标志而不禁用异步?

时间:2013-12-30 05:13:34

标签: javascript jquery ajax asynchronous

我有一个包含许多inpute文本字段的表单字段。一些领域期望一些类似的数据,因此我给了他们一个共同的类。请求使用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回复可能是“true”或“false”。我想计算“真实”的回复,并且如果有任何“错误”回复,也想设置一个标志。为了实现这一点,我使用了2个本地标志(最初为0),flag1(用于计算“真实”回复)和flag2(以确定是否有任何错误回复)。< / p>

如果(flag2 == 0 && flag1 > 0),我想做点什么。为了使flag1增量,我设置了async: false,但我得到了很多反馈,禁用async不是一个好习惯,所以我想摆脱它。有没有办法实现相同而不禁用async

1 个答案:

答案 0 :(得分:0)

现在,我还没有尝试过这段代码,您可能需要对其进行一些调整,但我认为这些方面的内容可行:

 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,尽管序列化表单并立即发送。但我相信你有充分的理由想要做什么。

同样,我还没有尝试过这段代码。我刚刚在手机上写了这个。但理论上它应该有用。