【问题标题】:JavaScript: How to get setInterval() to start now? [duplicate]JavaScript:如何让 setInterval() 现在开始? [复制]
【发布时间】:2011-11-17 10:59:58
【问题描述】:

我正在使用setInterval() 函数每 20 秒调用一次函数。但是,我注意到的一件事是 setInterval() 第一次实际调用该函数是在 20 秒(而不是在调用 setInterval() 时)。这是我目前的解决方法:

dothis();
var i = setInterval(dothis, 20000);

有没有办法在没有重复代码的情况下实现这一点?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您可以创建一个匿名函数并立即调用它,除非您使用 setTimeout 函数而不是 setInterval。

    (function doStuff() {
        //Do Stuff Here
        setTimeout(doStuff,20000);
    })();
    

    这将执行该函数,然后在 20 秒后再次调用它。

    请注意,根据您希望的行为或在某些情况下的性能,最好使用 setTimeout 而不是 setInterval。主要区别在于 setInterval 在超时时间到时调用该函数,无论最后一次调用是否已完成执行或是否发生错误。以这种方式使用 setTimeout 可确保函数在计时器重置之前完成其执行。很多权衡是显而易见的,但在设计应用程序时要牢记这一点。

    编辑 回应 patrick dw 对需要取消超时的担忧。最好的办法是不使用匿名函数,声明后调用

    var timeout;
    function doStuff() {
        //doStuff 
        timeout = setTimeout(doStuff,20000);
    }
    doStuff()
    

    是的,这与 OP 试图避免的类似,但它确实消除了调用函数然后调用 setInterval 函数的需要,因此您节省了一行代码。您可以通过以下方式随时停止和启动该功能:

    //Stop it
    clearTimeout(timeout);
    
    //Start it
    doStuff();
    

    【讨论】:

    • plus: setTimeout 更可取,因为如果出现错误它不会继续重复。
    • +1 如果没有其他需要从外部调用该函数,我认为这是一个很好的解决方案。
    • ...尽管您当前的答案失去了一点功能。 OP 将setInterval 的返回结果分配给了一个变量,这可能意味着应该在某个时候取消间隔。要复制该行为,您需要通过 setTimeout 进行递归调用,具体取决于可以设置为停止调用的标志的状态。
    • 当然,麻烦的是再次重新启动它。你可能需要把整个东西放在一个可以从外部调用的函数中,或者只是在封闭的变量环境中按名称公开函数,这样你就可以重新启动它。
    • 是的,如果以后需要召回和/或清除超时,那么最好的解决方案可能在我上面的编辑中找到
    【解决方案2】:

    如果您的dothis 函数不需要返回值,您可以让它自己返回。

    这将允许您同时调用和传递它。如果返回值被忽略,将是无害的。

    function dothis() {
        // your code
        return dothis;
    }
    
    var i = setInterval(dothis(), 20000);
    

    否则,您可以扩展 Function.prototype 为您的所有函数提供调用和返回功能:

    演示: http://jsfiddle.net/ZXeUz/

    Function.prototype.invoke_assign = function() {
        var func = this,
            args = arguments;
        func.call.apply( func, arguments );
        return function() { func.call.apply( func, args ); };
    };
    
    setInterval( dothis.invoke_assign( 'thisArg', 1, 2, 3 ), 20000 );
    
    // thisArg 1 2 3
    // thisArg 1 2 3
    // thisArg 1 2 3
    // ...
    

    这实际上增强了一些东西。它允许您传递一组参数。第一个参数将设置您正在调用的函数的 this 值,其余参数将作为常规参数传递。

    因为返回的函数被包装在另一个函数中,所以在初始调用和间隔调用之间会有相同的行为。

    【讨论】:

      【解决方案3】:

      您的方法是正常的方法。

      如果这种情况反复出现,您可以创建一个实用函数,首先执行处理程序,然后设置间隔:

      function setIntervalAndExecute(fn, t) {
          fn();
          return(setInterval(fn, t));
      }
      

      然后,在您的代码中,您可以这样做:

      var i = setIntervalAndExecute(dothis, 20000);
      

      【讨论】:

        猜你喜欢
        • 2015-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        相关资源
        最近更新 更多