当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;
}
....
}
谢谢您的时间!
答案 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的牺牲品,并且您需要在两个函数都可以访问它的地方声明它(但理想情况下是全局的)。