编写可以在经过一段时间(例如,5秒)或满足某些条件(例如bool = true
)时执行的代码的最佳和DRYest方法是什么 - 以先到者为准< / strong>即可。从脚本第一次运行开始计算五秒钟,布尔值是另一个函数更改的全局值。我不认为你可以在一个陈述中结合超时和布尔检查,但另一个好方法也很好。
伪代码:
if (bool = true OR timePassed = 5000):
runCode()
答案 0 :(得分:2)
如果在达到时间限制之前调用该函数,您可以设置超时并取消它。
var timeout = setTimeout(function() {
runCode();
}, 5000);
function runCode() {
clearTimeout(timeout);
...
}
编辑:现在我想到了,在这个例子中设置超时的更好方法是
var timeout = setTimeout(runCode, 5000);
答案 1 :(得分:0)
以下代码使用两个全局变量condition
和seconds
。如果condition
不是true
或seconds
不超过4,则计时器每秒运行一次并将秒数增加1.
condition = false // global
seconds = 0 // global
var timer = setInterval(function() {
if (condition || seconds > 4) {
clearInterval(timer)
}
seconds+=1;
}, 1000);
答案 2 :(得分: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
}
答案 3 :(得分:0)
这些答案实际上都没有提供问题的完整答案,即以先发生者为准未实现 - 或最终代码运行两次。
你需要一个计时器和一个条件(如其他答案所示,但未能在一个整体中合并)。
var done = false;
var thisTimeout = setTimeout(function() {
myFunction();
}, 1000);
if ((someCondition) && !done) {
myFunction();
}
function myFunction() {
clearTimeout(thisTimeout);
done = true;
// Do stuff
}
答案 4 :(得分:-1)
没有设置你想要的东西吗?
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);