如果ajax民意调查花费的时间超过x秒,则添加一个类

时间:2018-10-16 08:14:50

标签: javascript jquery ajax

当ajax轮询花费超过x秒(可能是1500毫秒)时,我想添加一个类(该类在输入中放入了微调器,但这不是问题)。我尝试过使用setInterval,然后在轮询完成时关闭间隔。但这没有运行。

我使用jquery进行ajax调用,并且使用属性“ async:false”,这可能是问题所在吗?如果删除此代码,我的代码将无法正常运行,因此需要ajax民意调查“ sync”。

那是我的代码:

function calcvat(){
    message_timer = setTimeout(function(){ 
     $('.js-vatinput').addClass('changing');
     }, 1000);

    if(isValidVAT()){ //In this function is the ajax
     ....
    }
}

function isValidVAT(){
...
$.ajax({
    data: {...},
    type: "POST",
    dataType: "json",
    async: false, //This could be the problem?
    url: url,
  }).done(function( data, textStatus, jqXHR ) {
    ...
    $('.js-vatinput').removeClass('changing');
    clearInterval(message_timer);
    message_timer = false;
}
....
    }

谢谢您的时间!

1 个答案:

答案 0 :(得分:0)

是的,async: false是问题所在。通过使用async: false,您可以在ajax调用完成时强制浏览器挂起主UI线程。 不允许UI更新,不能运行其他JavaScript代码,等等,直到ajax调用完成。

async: false永远都不正确。在任何情况下,它充其量只能带来糟糕的UX(它至少冻结了选项卡,也可能冻结了其他相关的选项卡;在较旧的浏览器(如IE8)上,它冻结了整个浏览器UI)。

删除async: false,然后(从您的代码中推断)只需禁用发送表单/执行此验证所参与的动作,而ajax调用将暂挂。


旁注1:1.5秒是一个很长的时间,想知道是否正在发生任何事情。建议最迟在250毫秒内提供反馈;立即反馈通常会更好。

旁注2:我假设message_timer被声明在某处。 :-)如果没有,则该代码将成为我所谓的The Horror of Implicit Globals的牺牲品,并且您需要在两个函数都可以访问它的地方声明它(但理想情况下是全局的)。