【问题标题】:second ajax call will take long to complete第二个 ajax 调用需要很长时间才能完成
【发布时间】:2016-02-04 12:21:38
【问题描述】:

编辑:我检查了我的 ajax 调用是否设置为异步运行。该代码将每 10 秒触发一次 ajax_counter_upload,但所有请求将一直进行到第一个请求完成,并且会报告所有调用的 100% 进度。

我有一个需要几分钟才能完成的 ajax 调用。所以我创建了第二个,它将为用户提供第一次通话进度的状态更新。 它曾经工作得很好,但现在我看到第二次通话将比第一次通话更长时间,因此只有在第一次通话完成后才会提供反馈。什么都没有改变:没有更新,没有任何软件的版本变化等等 我的代码如下:

var intervalID;

function counterUpdater(){
    intervalID = setInterval(ajax_counter_upload,10000);    
}
function ajax_counter_upload(){
    $.ajax({
        type: "POST",
        url: "plan/counter.php",
        data: {tipo:'BP'},
        success: function(data){
            $("#spinner_msg").fadeTo(200,0.1,
                function(){
                    $(this).html(data);
                    $(this).fadeTo(900,1);
                });
        }
    });
}
function ajax_submit(){
    var submit_val=$("#stato").serialize();
    dest="plan/new_bp1.php";
    $.ajax({
        type: "POST",
        url: dest,
        data: submit_val,
        success: function(data){ 
            data1=data.split("|");
            if(data1[0]=="Successo"){ 
                $("#spnmsg").fadeTo(200,0.1,
                    function(){$(this).removeClass().addClass("spn_success").html(data1[1]).fadeTo(900,1)});
                }else if(data1[0]=="Errore"){
                    $("#spnmsg").fadeTo(200,0.1,
                    function(){$(this).removeClass().addClass("spn_error").html(data1[1]).fadeTo(900,1)});  
                }
        },
        complete: function(){
            clearInterval(intervalID);
            $('#spinner_msg').html('');         
            setTimeout(function(){ $('.container').load('plan/home.php');},2000); 
        }
    });
    $('#spinner_msg').html('Avvio la creazione del nuovo business plan');
    setTimeout(function(){counterUpdater();},2000);
}

所以每两秒 counterUpdater 就会神奇地向用户提供反馈。 注意:counterUpdater 调用会成功,但只会花费太多时间来完成

【问题讨论】:

  • 实际上这是在 ajax_submit 运行时每 2 秒触发第二次 Ajax 调用的原因
  • 听起来您的服务器一次只处理一个请求。关于第一个 ajax_counter_upload 请求,您的网络选项卡(浏览器控制台)怎么说?待定状态?你确定你没有将全局ajax请求设置为同步吗?您可以使用$.ajaxPrefilter(function( options) { console.log(options.async); }); 进行检查
  • 不,我没有将 Ajax 调用设置为同步,我确定并且已经验证。从一天到另一天,此代码按预期停止工作。第二个 Ajax(仅从单行表中检索一行)等待答案超过一分钟(查看控制台)
  • 它是专用服务器、共享服务器还是本地服务器?
  • 这是一个专用的、超大的(目前)服务器

标签: jquery ajax


【解决方案1】:

clearInterval(intervalID); 需要放在ajax_counter_upload() 函数的success 中,而不是放在ajax_submit()

【讨论】:

  • 我猜,一旦ajax_submit 请求完成,没有 OP 想要停止检查进度
  • @A.Wolff 和 Lelio :但是 ajax_counter_upload() 会在指定的间隔时间后一次又一次地触发,因为 Lelio 正在使用 setInterval... 所以它可能会进入一个循环,对吗?如果我没记错的话……或者最好使用setTimeout
【解决方案2】:

我可能错了,但似乎ajax_counter_upload 在 12 秒后收到了它的初始呼叫。

您拨打counterUpdater();两秒后,然后每 10 秒启动一次ajax_counter_upload。 尝试将 setInterval 的 10000(ms) 减少到一个较小的数字。

【讨论】:

  • 抱歉,这不是问题所在。问题是 counterUpdater 调用将在 Ajax_updater 完成后完成
  • 太糟糕了,您可以尝试在 ajax 请求之前触发超时,这不应该改变任何东西,但它可以帮助...
  • 所以电话迟到了,而不是请求?
  • @LelioFaieta 也,您是否尝试过其他浏览器?也许你的浏览器更新了,这就是它的问题?
猜你喜欢
  • 2016-07-01
  • 2018-02-07
  • 2016-07-30
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多