【问题标题】:time remainder of setInterval JavaScriptsetInterval JavaScript 的剩余时间
【发布时间】:2018-02-03 13:27:24
【问题描述】:

我希望能够在 setInterval 剩余时间的情况下运行代码。

  let car = setInterval(function() {
    // stuff
  }, 2000);

  let vehicle = setInterval(function() {
    train()
  }, 1000);

  function train() {
    // stuff
    // and if car has time left, do this stuff too.
  }

在火车功能的最后一行,我想检查汽车的剩余时间,但不明白如何进行这样的概念。 我想知道确切的剩余时间或仅仅知道还有时间对我来说是一样的,所以哪个更容易。

【问题讨论】:

  • 不必担心时间的细节,您可以分配/绑定事件,通知观察者何时完成操作...

标签: javascript function time timer setinterval


【解决方案1】:

请记住,计时器可能非常不精确,setInterval 的规则...有趣...如果您的处理程序在下一个间隔开始时运行过去。记住这一点很重要。

但是,如果您的目标是知道从开始调用计时器以来已经过了多长时间,以及何时将计时器再次设置为触发,则需要记住您何时开始

var start = Date.now();

...然后检查它相对于间隔的时间。例如:

if (Date.now() - start >= 1900) {
    // It's been at least 1900ms since the start of the `vehicle` call,
    // so based on a 2000ms interval, in theory you have only 100ms left
}

但是,再次请注意,如果其他事情使 UI 线程处于忙碌状态,计时器可能会非常不精确。

【讨论】:

  • (如果上面没有看到>= 1900,请点击刷新。)
【解决方案2】:

这是不可能的。计时器实际上是在 JavaScript 运行时之外执行的,并且其中指定的时间从来都不是精确的测量 - 它实际上是计时器可以预期运行的最短时间。实际的时间量取决于 JavaScript 运行时的繁忙程度,如果运行时在计时器超时时处于空闲状态,则可以运行计时器的回调函数。

因此,本质上,您必须计算 JavaScript 执行堆栈需要多长时间才能变为空闲状态,这是您无法做到的,因为要获得该时间测量值,您必须执行剩余的代码.所以,在没有时间之前,你无法得到答案。

但是,根据您的代码,您似乎可以设置一个简单的“标志”变量,该变量在car 运行时设置。因此,在train 中,您可以检查该标志是否已设置,如果没有,请运行train 代码,然后重置该标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2021-10-26
    • 1970-01-01
    • 2014-08-12
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多