什么是最好的和DRYest的方法来编写代码,可以执行一段时间(例如5秒)或满足某些条件(例如bool = true
) - 以先到者为准。从脚本第一次运行开始,五秒钟开始计算,布尔值是由另一个函数更改的全局值。我不认为你可以在一个声明中结合时间和布尔检查,但另一个好方法也很好。经过一段时间或条件满足后运行代码
伪代码:
if (bool = true OR timePassed = 5000):
runCode()
什么是最好的和DRYest的方法来编写代码,可以执行一段时间(例如5秒)或满足某些条件(例如bool = true
) - 以先到者为准。从脚本第一次运行开始,五秒钟开始计算,布尔值是由另一个函数更改的全局值。我不认为你可以在一个声明中结合时间和布尔检查,但另一个好方法也很好。经过一段时间或条件满足后运行代码
伪代码:
if (bool = true OR timePassed = 5000):
runCode()
无其实这个问题提供一个完整的答案,即,以先到者为准未实现 - 或者最终的代码运行两次。
你需要一个计时器和一个条件(如其他答案建议,但未能在一个整体中结合)。
var done = false;
var thisTimeout = setTimeout(function() {
myFunction();
}, 1000);
if ((someCondition) && !done) {
myFunction();
}
function myFunction() {
clearTimeout(thisTimeout);
done = true;
// Do stuff
}
是不是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);
不,我想在满足条件或定时器用完时运行一些代码。以先到者为准。 –
然后使用两者,一个间隔很小的检查条件和运行代码的超时(如果完成)。如果执行取消另一个。 – PeterS
下面的代码使用两个全局变量,condition
和seconds
。定时器运行1每秒,并增加秒,如果condition
不是true
或seconds
不超过4
condition = false // global
seconds = 0 // global
var timer = setInterval(function() {
if (condition || seconds > 4) {
clearInterval(timer)
}
seconds+=1;
}, 1000);
您可以设置超时时间,并且取消它,如果在到达时间限制之前的函数被调用。
var timeout = setTimeout(function() {
runCode();
}, 5000);
function runCode() {
clearTimeout(timeout);
...
}
编辑:现在我想起来了,一个更好的方式来设定在这种情况下超时将是答案的
var timeout = setTimeout(runCode, 5000);
如果在设置布尔值之前计时器耗尽,该怎么办?你如何取消它呢? –
@BramVanroy你会[需要一个标志](http://stackoverflow.com/a/36971492/2788872)指出条件是否已经被满足。 –
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
}
每隔一秒检查一次条件是否成立? – Edward
@爱德华似乎过度杀伤。必须是更好的方法。 –
使用一个标志,哪个条件先运行改变标志,并且该函数将不运行nomore – maioman