经过一段时间或满足条件后运行代码

时间:2016-05-01 20:08:36

标签: javascript jquery conditional-statements settimeout

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

伪代码:

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

5 个答案:

答案 0 :(得分:2)

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

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

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

编辑:现在我想到了,在这个例子中设置超时的更好方法是

var timeout = setTimeout(runCode, 5000);

答案 1 :(得分:0)

以下代码使用两个全局变量conditionseconds。如果condition不是trueseconds不超过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);