经过一段时间或满足条件后运行代码
什么是编写代码的最佳和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);
以下代码使用两个全局变量condition
和seconds
。 计时器每秒运行一次,如果condition
不为true
或seconds
不超过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);