2017-02-08 58 views
0

我原来的问题是关于类似这样的代码块:的setTimeout或setInterval的延迟检查

delayTime = 1000; 
reducedDelay = 0; 

setInterval(
function(){ 

//Code which calculates reduced delay 

    reducedDelay = /* -- Any integer -- */; 

    delayTime = 1000 - reducedDelay; 

},delayTime) 

delayTime是一个全球范围内的变量,所以我的理解,delayTime将由表达更新delayTime = 1000 - reducedDelay;setInterval会再次调用该函数并更新delayTime延迟...对吗?

这只是一个用途,但我无法找到一种方法来实际检查setInterval()setTimeout()的延迟。如何检查delayTime(第二个参数)?

更好地表达它:一个人怎么能检查setTimeout()setInterval('param 1', 'param 2') < - “参数2”是延迟,怎么会检查setInterval实际执行是否正确? (即延迟下一次'param 1'的正确时间)。

+1

setInterval仅在1000ms延迟时间内被调用一次。更改delayTime不会执行任何操作。 –

+0

你不能得到第二个参数传递到超时,只是跟踪你自己 –

+0

@StephenBugsKamenar感谢你的答复,但如果初始调用是重要的 - 比如何能打击延迟? –

回答

0

当您拨打setInterval时,您发送的是值,而不是变量引用。所以在你打电话之后,如果你改变了它并不重要。
但是回答你关于如何检查的问题,你不能得到它正在使用的价值,但你可以测量它。

reduce = 5000; 
lastCall = (new Date()).getTime(); 
setInterval(function(){ 
    reduce-=1000; 
    console.log("New reduce value : "+reduce); 
    newTime = (new Date()).getTime(); 
    console.log("Time since last call : "+(newTime - lastCall)); 
    lastCall = newTime; 
},reduce); 

您可以将此代码复制粘贴到此页面的控制台中进行测试。 ;)
顺便说一句,如果你想让你的代码工作,你可以递归调用setTimeout。这会做到这一点。

+0

谢谢你的回答,我运行了代码和两次通话之间的时间徘徊在5000毫秒左右,我想我做我的代码的方式,这将减少延迟,并尽可能使其尽可能活跃。但是你和@StephenBugsKamenar似乎在说的是变量在初始调用后的值并不重要。但是这让我感到困惑,如何才能对抗延迟?就像你说的,递归setTimeout调用是要走的路吗? –

+0

更新,我用这种格式的递归setTimeout调用: recursiveLoop(); 功能recursiveLoop(){ 的setTimeout(函数(){ //代码,其计算的等待时间以及由延迟减少delayTime,类似于原始示例 recursiveLoop();} ,delayTime) } 现在在这个例子中,因为我正在计算一个新的delayTime来补偿延迟,setTimeout会被补偿delayTime调用,还是会被修复,就像我的setInterval示例 –

+0

我不确定哪个是最终的目的,但我认为那些想要保持准确的人通常使用'requestAnimationFrame()'当你的函数被调用并且你根据最后一次调用时间来计算变化时,它给了你时间 –