JavaScript在setInterval之前未更新
谢谢肖恩的帮助。我已经按照您的建议将计算代码移动到它自己的方法。调试后,我意识到问题与全局存储值有关。我想我不小心创建了闭包。我已将计算代码移动到名为calculate()的方法中,该方法只运行一次,以便全局设置变量的值。但是,当该方法运行时,会设置正确的值,只要该方法退出并调用move()方法,所有值都会设置为未定义或0。在计算方法中,我甚至使用了一个隐藏字段来设置值('mills'),这样我就可以将间隔时间传递给这个testTimer=window.setInterval(move,document.getElementById('mills')。value,“testTimer”);calculate()方法的代码如下所示:-JavaScript在setInterval之前未更新,javascript,Javascript,谢谢肖恩的帮助。我已经按照您的建议将计算代码移动到它自己的方法。调试后,我意识到问题与全局存储值有关。我想我不小心创建了闭包。我已将计算代码移动到名为calculate()的方法中,该方法只运行一次,以便全局设置变量的值。但是,当该方法运行时,会设置正确的值,只要该方法退出并调用move()方法,所有值都会设置为未定义或0。在计算方法中,我甚至使用了一个隐藏字段来设置值('mills'),这样我就可以将间隔时间传递给这个testTimer=window.setInterval(move,docu
var duration_equiv_seconds = 0;
var duration_equiv_millsec = 0;
var elapsed_percentage = 0;
var elapsed = 0;
var duration = 0;
// function in one JS file
function calculate () {
duration = document.getElementById('callDuration').value;
elapsed = document.getElementById('callElapsed').value;
duration_equiv_seconds = duration/100;
duration_equiv_millsec = duration_equiv_seconds * 1000;
document.getElementById('mills').value = Number(duration)/100 * 1000 ;
elapsed_percentage = (elapsed/duration) * 100;
display_progress(elapsed_percentage);
var countCalc = 0;
document.getElementById('status_message').innerHTML =" CountCalc = " + countCalc + " duration = " + duration + " elapsed =" + elapsed + " elapsed2Var =" + elapsed2Var +" duration_equiv_seconds = " + duration_equiv_seconds + " duration_equiv_millsec=" + duration_equiv_millsec + "
elapsed_percentage=" + elapsed_percentage; countCalc++; return duration_equiv_millsec; }
function voice_progress (time_interval){
// outer timer
voiceTimer = window.setInterval(function(){
handleDurationElapsedRequest()
// outside
function move(){
var count = 0;
duration = document.getElementById('callDuration').value;
elapsed = document.getElementById('callElapsed').value;
duration_equiv_seconds = duration/100;
duration_equiv_millsec = duration_equiv_seconds * 1000;
elapsed = Number(elapsed) + Number(duration_equiv_seconds);
elapsed_percentage = (elapsed/duration) * 100;
document.getElementById('callElapsed').value = elapsed;
display_progress(elapsed_percentage);
move_bar(elapsed_percentage);
if (elapsed_percentage >= 100){
terminate_timer(testTimer);
}
document.getElementById('status_message').innerHTML =" at the endAt the end" + count + " duration = " + duration + " elapsed =" + elapsed +" duration_equiv_seconds = " + duration_equiv_seconds + " duration_equiv_millsec=" + duration_equiv_millsec + " elapsed_percentage=" + elapsed_percentage;
count++;
return duration_equiv_millsec;
}
var sleepTime = calculate(); // sleep time returns 0
testTimer = window.setInterval(move,document.getElementById('mills').value ,"testTimer");
},time_interval,"voiceTimer"); // end of outer Timer (time_interval = 1500) called from <body onload="voice_progress(1500);">
}
//.................................................................`enter code here`
// in another JS file
// XMLHttpObject is created called, server returns the correct values
function handleDurationElapsedRequest(){
if(xmlHttpObject.readyState==4){
if(xmlHttpObject.status==200){
var resp = xmlHttpObject.responseText;
var respArray = resp.split("-");
document.getElementById('callElapsed').value = respArray[0]; //value set here is 47
document.getElementById('callDuration').value = respArray[1]; // value set here is 240
document.getElementById('mills').value = respArray[1]/100 * 1000 ;
}
}
}
var持续时间等于秒=0;
var持续时间=0;
风险值百分比=0;
var=0;
var持续时间=0;
//函数在一个JS文件中
函数计算(){
持续时间=document.getElementById('callDuration')。值;
已用=document.getElementById('CalleFassed')。值;
持续时间等于秒=持续时间/100;
持续时间=持续时间=秒*1000;
document.getElementById('mills')。值=编号(持续时间)/100*1000;
已用百分比=(已用/持续时间)*100;
显示进度(已用百分比);
var countCalc=0;
document.getElementById('status_message')。innerHTML=“CountCalc=“+CountCalc+”duration=“+duration+”appead=“+appead+”elapsed2Var=“+elapsed2Var+”duration_equiv_seconds=“+duration_equiv_seconds+”duration_equiv_millsec=“+duration_equiv_millsec+”
已用_百分比=“+已用_百分比;countCalc++;返回持续时间_等效_millsec;}
功能语音进度(时间间隔){
//外部定时器
voiceTimer=window.setInterval(函数(){
HandleDurationeFassedRequest()
//外面
函数move(){
var计数=0;
持续时间=document.getElementById('callDuration')。值;
已用=document.getElementById('CalleFassed')。值;
持续时间等于秒=持续时间/100;
持续时间=持续时间=秒*1000;
已用=次数(已用)+次数(持续时间等于秒);
已用百分比=(已用/持续时间)*100;
document.getElementById('CalleFassed')。值=已用时间;
显示进度(已用百分比);
移动_条(经过的_百分比);
如果(已用百分比>=100){
终止计时器(testTimer);
}
document.getElementById('status_message').innerHTML=“在结尾处”+count+”duration=“+duration+”appead=“+appead+”duration_equiv_seconds=“+duration_seconds+”duration_equiv_millsec+”appead_percentage=“+appead_percentage”;
计数++;
返回持续时间等于millsec;
}
var sleepTime=calculate();//睡眠时间返回0
testTimer=window.setInterval(move,document.getElementById('mills')。值,“testTimer”);
},time_interval,“voiceTimer”);//从调用的外部计时器(time_interval=1500)结束
}
//在此处输入代码`
//在另一个JS文件中
//当调用XMLHttpObject创建时,服务器返回正确的值
函数handleDurationeReleasedRequest(){
if(xmlHttpObject.readyState==4){
if(xmlHttpObject.status==200){
var resp=xmlHttpObject.responseText;
var respArray=resp.split(“-”);
document.getElementById('CalleFassed')。value=respArray[0];//此处设置的值为47
document.getElementById('callDuration')。value=respArray[1];//此处设置的值为240
document.getElementById('mills')。value=respArray[1]/100*1000;
}
}
}
问题在于您正在回调中进行计算,因此当您开始时,所有变量仍然为0
在调用setInterval
之前,将时间计算拉到它自己的函数中,并调用该函数,您的值将从正确的数字开始。(当然,继续在回调中调用它。)
您还将重新安排setInterval
调用move
。这可能是错误的,因为它将在每个间隔重新调用,所以现在有两个函数在计时器上被调用。如果使用setTimeout
,则可能需要重新安排,但不能使用setInterval
同样的计算也要进行两次——JavaScript是真实的代码,您应该这样对待它;把它拉到一个你可以调用的函数中
--编辑--
现在从move()
调用calculate()
,这样两个位置就没有相同的代码了。;-)
callDuration
和CalleReleased
仅在请求完成时从HandleDurationeReleasedRequest
设置。这可能就是你得到0的原因。你到底想在这里干什么?整个页面是否在线?谢谢您的帮助。我已经解决了这个问题。问题是,在从服务器检索到“callDuration”和“CalleFassed”之前,我读取了它们的值。我通过在执行读取这些值的代码ie window.setTimeout(“calculate()”,1500)之前设置1.5秒的超时时间来修复这个问题
再次感谢您的帮助。谢谢肖恩,我仍然有问题。我已经修改了密码。请看。谢谢