【问题标题】:Run code after some time has passed or a condition is met经过一段时间或满足条件后运行代码
【发布时间】:2016-08-26 13:33:35
【问题描述】:

编写可以在经过一段时间(例如,5 秒)或满足某些条件(例如 bool = true)时执行的代码的最佳和最干燥方式是什么 - 以先到者为准。五秒从脚本第一次运行开始计算,布尔值是一个全局变量,由另一个函数更改。我认为您不能将超时和 bool-check 结合在一个语句中,但另一种好方法也不错。

伪代码:

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

【问题讨论】:

  • 每隔一秒检查一次条件是否为真?
  • @Edward 似乎矫枉过正。一定是更好的方法。
  • 使用一个标志,无论哪个条件先运行都会改变标志,并且函数将不再运行
  • @bram 您可以尝试obj.watch() 方法,该方法会在属性更改时提醒您我不确定该解决方案的跨浏览器程度。
  • 试试this,越干越好;

标签: javascript jquery conditional-statements settimeout


【解决方案1】:

没有一个答案实际上提供了对问题的完整答案,即以先到者为准没有实现——或者最终的代码运行了两次。

您需要一个计时器和一个条件(正如其他答案所建议的那样,但未能结合成一个整体)。

var done = false;
var thisTimeout = setTimeout(function() {
    myFunction();
}, 1000);

if ((someCondition) && !done) {
    myFunction();
}
function myFunction() {
    clearTimeout(thisTimeout);
    done = true;
    // Do stuff
}

【讨论】:

    【解决方案2】:

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

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

    编辑:现在我想到了,在这种情况下设置超时的更好方法是

    var timeout = setTimeout(runCode, 5000);
    

    【讨论】:

    • 如果计时器在设置布尔值之前用完怎么办?反过来怎么取消呢?
    • @BramVanroy 你会need a flag 表明之前是否已经满足条件。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      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
      }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 没有。我想在满足条件或计时器用完时运行一些代码。以先到者为准。
        • 然后使用两者,其中一个间隔很小,只是检查条件和运行代码的超时(如果完成)。如果任一执行取消另一个。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多