3

我的 jQuery 记录插入过程遇到了两个问题,我希望这个出色的 SO 社区可以帮助我解决至少一个问题。这些是问题:

问题 1 - 间歇性服务器延迟

POST第一个问题与我的 Ubuntu 10.04 服务器在对 mySQL 数据库执行数据时似乎表现出间歇性的 4.5 秒延迟有关。大多数POST命令在正常的毫秒内执行,但是当出现延迟时,似乎总是大约 4.5 秒。这不是一个繁忙的公共服务器,所以它不应该是服务器负载的问题。这些短片展示了我要解释的内容:

视频 1 视频 2

我在serverfault上发布了一个问题,正在等待来自该论坛的一些输入,这可能更适合此问题 1。

问题 2 - jQuery POST 和 GET 方法的时序

我要解决的真正问题是GET所有调用完成之前POST阻止调用。目前,我已实施延迟发送. 这是代码:$.when.applyGET

function(){
  $.when.apply(undefined, InsertTheAPPs()).done(function (){
    $.ajax({
      url: sURL + "fileappeal/send_apps_email",
      success: function() {
        var m = $.msg("my message",
        {header:'my header', live:10000});
        setTimeout(function(){
          if(m)m.setBody('...my other message.');
        },3000);
        setTimeout(function(){
          if(m)m.close(function(){
              window.location.replace(sURL+'client/view');
          });
        },6000);
        $('#ajaxShield').fadeOut(1000);
      },
      error: function(){
          $.msg("error message",
          {header:'error header', live:10000});
      }
    });
  });
}

我的问题是由于上述问题 1 中描述的延迟而出现的。GET在所有POST方法都开始后调用该方法,但我需要该GET方法等到所有POST方法都结束。这是我需要帮助的问题。基本上,这里发生的事情是错误的,我的确认电子邮件是在所有记录完全插入到 mySQL 数据库之前发送的。

这是 jQuery$.each循环的代码。这是不仅需要begin,而且必须在上面的 ajax 调用之前结束fileappeal/send_apps_email的代码:

function InsertTheAPPs(){
  $('input[name=c_maybe].c_box').each(function(){
    var jqxhrs = [];
    if($(this).prop('checked')){
      var rn = $(this).prop('value');
      jqxhrs.push(
        $.ajax({
          url: sURL + 'fileappeal/insert_app',
          type:"POST",
          dataType: 'text',
          data: {'rn': rn},
          error: function(data) {console.log('Error:'+rn+'_'+data);}
        })
      )
    return jqxhrs;
    }
  });
}

有人对我如何解决服务器延迟问题并防止GET在所有POST方法完成之前调用 有任何建议吗?谢谢。

4

1 回答 1

1

你的帖子有点小问题。在你解决它之后,这篇文章应该可以帮助你完成你的代码:jQuery Deferred - waiting for multiple AJAX requests to finish

您正在返回内部,.each但函数本身不返回任何内容。所以你的延迟没有得到等待的ajax调用数组。而且,由于您的 jqhrs 是在 each 内部定义的,因此范围是每个 c_box 上的每次迭代。您的方法应如下所示:

function InsertTheAPPs(){
    var jqxhrs = [];

    $('input[name=c_maybe].c_box').each(function(){         
        if($(this).prop('checked')){ 
            var rn = $(this).prop('value'); 
            jqxhrs.push(
                $.ajax({
                    url: sURL + 'fileappeal/insert_app',
                    type:"POST",
                    dataType: 'text',
                    data: {'rn': rn},
                    error: function(data) {console.log('Error:'+rn+'_'+data);}
                })
            )
        }
    });

    return jqxhrs;
} 

您还可以使您的代码更容易。由于您只想知道是否检查了某些内容,因此可以使用 jquery 伪类过滤器:checked,例如:

function InsertTheAPPs(){
    var jqxhrs = [];

    $('input[name=c_maybe].c_box').filter(':checked').each(function(){         
        var rn = $(this).prop('value'); 
        jqxhrs.push(
            $.ajax({
                url: sURL + 'fileappeal/insert_app',
                type:"POST",
                dataType: 'text',
                data: {'rn': rn},
                error: function(data) {console.log('Error:'+rn+'_'+data);}
            })
        )
    });

    return jqxhrs;
} 

您可以将过滤器组合:checked到主过滤器中,$('input[name=c_maybe].c_box:checked')但我将其保留为长格式以真正展示发生了什么。

于 2013-01-30T15:18:45.143 回答