2016-05-01 60 views
3

什么是最好的和DRYest的方法来编写代码,可以执行一段时间(例如5秒)或满足某些条件(例如bool = true) - 以先到者为准。从脚本第一次运行开始,五秒钟开始计算,布尔值是由另一个函数更改的全局值。我不认为你可以在一个声明中结合时间和布尔检查,但另一个好方法也很好。经过一段时间或条件满足后运行代码

伪代码:

if (bool = true OR timePassed = 5000): 
    runCode() 
+0

每隔一秒检查一次条件是否成立? – Edward

+0

@爱德华似乎过度杀伤。必须是更好的方法。 –

+0

使用一个标志,哪个条件先运行改变标志,并且该函数将不运行nomore – maioman

回答

0

无其实这个问题提供一个完整的答案,即,以先到者为准未实现 - 或者最终的代码运行两次。

你需要一个计时器和一个条件(如其他答案建议,但未能在一个整体中结合)。

var done = false; 
var thisTimeout = setTimeout(function() { 
    myFunction(); 
}, 1000); 

if ((someCondition) && !done) { 
    myFunction(); 
} 
function myFunction() { 
    clearTimeout(thisTimeout); 
    done = true; 
    // Do stuff 
} 
-1

是不是setTimeout的你在找什么?

setTimeout(function() { 
    if (mycondition) { 
     //do work 
    } 
}, 1000); 

将等待1000毫秒,并做出声明。如果你的布尔条件是基于事件的事情,那么你可以听它。是什么导致布尔变成真?这听起来像超时是无关紧要的,所以我们只需要检查大概每100毫秒的条件:

setInterval(function() { 
    if (mycondition) { 
     //do work 
    } 
}, 100); 

这是否帮助你?

因此,完整的解决方案:

var mytimeout, myinterval; 
mytimeout = setTimeout(function() { 
     //do work 
     clearInterval(myinterval); 
}, 5000); 
myinterval = setInterval(function() { 
     if (condition) { 
      clearTimeout(mytimeout); 
      //dowork 
     } 
}, 100); 
+1

不,我想在满足条件或定时器用完时运行一些代码。以先到者为准。 –

+0

然后使用两者,一个间隔很小的检查条件和运行代码的超时(如果完成)。如果执行取消另一个。 – PeterS

0

下面的代码使用两个全局变量,conditionseconds。定时器运行1每秒,并增加秒,如果condition不是trueseconds不超过4

condition = false // global 
seconds = 0 // global 

var timer = setInterval(function() { 
if (condition || seconds > 4) { 
    clearInterval(timer) 
} 
seconds+=1; 
}, 1000); 
2

您可以设置超时时间,并且取消它,如果在到达时间限制之前的函数被调用。

var timeout = setTimeout(function() { 
    runCode(); 
}, 5000); 

function runCode() { 
    clearTimeout(timeout); 
    ... 
} 

编辑:现在我想起来了,一个更好的方式来设定在这种情况下超时将是答案的

var timeout = setTimeout(runCode, 5000); 
+0

如果在设置布尔值之前计时器耗尽,该怎么办?你如何取消它呢? –

+0

@BramVanroy你会[需要一个标志](http://stackoverflow.com/a/36971492/2788872)指出条件是否已经被满足。 –

0
window.onload = function(){ 
    var timer = setTimeout(RunCode, 5000); 
    function RunCode(){ 
     //do something 
     //RunCode() already done and we don't want to run it second time 
     element.onevent = function(){}; 
    } 
    //pseudo code 
    element.onevent = function(){ 
     clearTimeout(timer); 
     RunCode(); 
    } 
    //possibly more event handlers with similar logic 
}