JavaScript在setInterval之前未更新

JavaScript在setInterval之前未更新,javascript,Javascript,谢谢肖恩的帮助。我已经按照您的建议将计算代码移动到它自己的方法。调试后,我意识到问题与全局存储值有关。我想我不小心创建了闭包。我已将计算代码移动到名为calculate()的方法中,该方法只运行一次,以便全局设置变量的值。但是,当该方法运行时,会设置正确的值,只要该方法退出并调用move()方法,所有值都会设置为未定义或0。在计算方法中,我甚至使用了一个隐藏字段来设置值('mills'),这样我就可以将间隔时间传递给这个testTimer=window.setInterval(move,docu

谢谢肖恩的帮助。我已经按照您的建议将计算代码移动到它自己的方法。调试后,我意识到问题与全局存储值有关。我想我不小心创建了闭包。我已将计算代码移动到名为calculate()的方法中,该方法只运行一次,以便全局设置变量的值。但是,当该方法运行时,会设置正确的值,只要该方法退出并调用move()方法,所有值都会设置为未定义或0。在计算方法中,我甚至使用了一个隐藏字段来设置值('mills'),这样我就可以将间隔时间传递给这个testTimer=window.setInterval(move,document.getElementById('mills')。value,“testTimer”);calculate()方法的代码如下所示:-

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秒的超时时间来修复这个问题


再次感谢您的帮助。

谢谢肖恩,我仍然有问题。我已经修改了密码。请看。谢谢