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

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

伪代码:

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

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

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

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

 var timeout = setTimeout(runCode, 5000); 

以下代码使用两个全局变量conditionseconds 。 计时器每秒运行一次,如果condition不为trueseconds不超过4,则seconds增加1。

 condition = false // global seconds = 0 // global var timer = setInterval(function() { if (condition || seconds > 4) { clearInterval(timer) } seconds+=1; }, 1000); 
 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 } 

这些答案实际上都没有提供问题的完整答案,即首先没有实现的是 – 或最终的代码运行两次。

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

 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); 

将等待1000ms并做声明。 如果您的布尔条件是基于事件的事情,那么您可以听取它。 是什么导致布尔值变为真? 这听起来像超时是无关紧要的,所以我们只需要每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);