如何使setTimeout的刷新频率成为变量?

时间:2017-05-01 20:20:49

标签: javascript settimeout

我想要一个我正在编写的函数来自动调用它自己。我希望能够通过第一次解析它来解析它自己调用的频率。然后它将在内部使用相同的值与JS setTimeout()函数以相同的频率重复调用自身。

所以你可以在下面的示例中看到我的内容:

INSERT

问题是这不起作用,因为从第二次运行开始,未评估解析的超时。控制台输出提供了这里发生的事情的线索:

  

频率:未定义

我如何才能实现这一目标,迄今为止没有任何帮助。

2 个答案:

答案 0 :(得分:3)

请尝试使用Window setInterval() Method。另请参阅this answerthis answer以获取更多信息。



var autoInterval;
var elapsed = 0;

function myStartFunction(refreshFrequ) {
  if (!autoInterval) {
    autoInterval = setInterval(function() {
      elapsed++;
      document.getElementById("txt").innerHTML = refreshFrequ * elapsed + " elapsed.";
      console.log("frequency interval: " + refreshFrequ + " x " + elapsed);
    }, refreshFrequ);
  }
}

function myStopFunction() {
  if (autoInterval) {
    clearInterval(autoInterval);
    autoInterval = null;
    elapsed = 0;
    document.getElementById("txt").innerHTML = "Interval was reset.";
    console.log("interval stopped");
  }
}

myStartFunction(5000);

<p>The setInterval() method has started automatically.</p>

<button onclick="myStartFunction(1000)" title="Start with 1000 ms interval. Clicking this button while the event is active should not create a new interval instance.">Start</button> <button onclick="myStopFunction()" title="Click to stop and clear the interval instance.">Stop</button>

<p id="txt">0 elapsed.</p>
&#13;
&#13;
&#13;

编辑:虽然没有提及潜在的重复函数调用,但应考虑the other answer,尤其是在事件可以任意执行的情况下。强制执行if语句是为了防止重复事件与原始实例相叠加;否则,每个额外执行的函数将导致一个唯一的实例,然后可以进一步创建不可阻挡的多个事件,所以我必须在信用到期时给予信用。感谢Tymek

答案 1 :(得分:1)

您可能希望改为使用setInterval

var testFunction = (function () { // This will "build"/"enclose" our function
    var handle = null; // ID of the interval
    return function (freq) {
      if (handle !== null) clearInterval(handle);
      handle = setInterval(function() {
        console.log("frequency: " + freq);
      }, freq);
    };
})();

如果你重新初始化间隔,你就不会创建它的另一个实例(有2个函数勾选)。

您可以在https://www.w3schools.com/jsref/met_win_setinterval.asp了解有关setInterval的更多信息 以及有关JavaScript函数如何在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

中运行的更多信息