谢谢肖恩的帮助。我已按照您的建议将计算代码移动到自己的方法中。经过调试后,我意识到问题与全局存储值有关。我想我已经意外地创造了闭包。我已将计算代码移动到名为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 ;
}
}
}
答案 0 :(得分:0)
问题是你在回调中进行计算,所以当你开始时,你的所有变量都是0。
将时间计算拉出到自己的函数中,并在调用setInterval
之前调用它,并且您的值将以正确的数字开头。 (当然,继续在你的回调中调用它。)
您还在setInterval
内重新安排move
来电。这可能是错误的,因为它会在每个间隔重新调用,所以现在你有两个函数在一个计时器上被调用。如果您使用setTimeout
,则可能需要重新安排,但不能使用setInterval
。
你也有两次相同的计算 - JavaScript是真正的代码,你应该这样对待它;将其拉出可以调用的功能。
- 编辑 -
现在从calculate()
拨打move()
,因此您在2个地方没有相同的代码。 ; - )
callDuration
和callElapsed
仅从handleDurationElapsedRequest
设置,并且仅在请求完成时设置。这可能就是你得到0的原因。你到底想要做什么?整个页面是否在某处?
答案 1 :(得分:0)
感谢您的帮助。我已经解决了这个问题。问题是我在从服务器检索它们之后甚至更新了值'callDuration'和'callElapsed'。我通过在执行读取这些值的代码之前设置1.5秒的超时来修复此问题,即window.setTimeout(“calculate()”,1500);
再次感谢您的帮助。