JavaScript在setInterval之前没有更新

时间:2011-07-14 11:16:25

标签: javascript

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

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 ;

            }  
      }
    }

2 个答案:

答案 0 :(得分:0)

问题是你在回调中进行计算,所以当你开始时,你的所有变量都是0。

将时间计算拉出到自己的函数中,并在调用setInterval之前调用它,并且您的值将以正确的数字开头。 (当然,继续在你的回调中调用它。)

您还在setInterval内重新安排move来电。这可能是错误的,因为它会在每个间隔重新调用,所以现在你有两个函数在一个计时器上被调用。如果您使用setTimeout,则可能需要重新安排,但不能使用setInterval

你也有两次相同的计算 - JavaScript是真正的代码,你应该这样对待它;将其拉出可以调用的功能。

- 编辑 -

现在从calculate()拨打move(),因此您在2个地方没有相同的代码。 ; - )

callDurationcallElapsed仅从handleDurationElapsedRequest设置,并且仅在请求完成时设置。这可能就是你得到0的原因。你到底想要做什么?整个页面是否在某处?

答案 1 :(得分:0)

感谢您的帮助。我已经解决了这个问题。问题是我在从服务器检索它们之后甚至更新了值'callDuration'和'callElapsed'。我通过在执行读取这些值的代码之前设置1.5秒的超时来修复此问题,即window.setTimeout(“calculate()”,1500);

再次感谢您的帮助。