【问题标题】:Javascript: How to run function1 for x seconds, then function2 for y seconds, then repeat indefinitely?Javascript:如何运行 function1 x 秒,然后运行 ​​function2 y 秒,然后无限期地重复?
【发布时间】:2017-11-03 16:58:56
【问题描述】:

我已经看到了几个与我想弄清楚的问题类似的问答,但并没有真正帮助我。

我想做的是:

function1(); //for 9 seconds
stop.function1();
function2(); //for 1 second
stop.function2();

然后无限期地重复这个过程。我已经尝试了很多不同的超时和间隔方式,但永远无法让它正常工作。我很感激任何帮助。谢谢!

更新:

Function1 使用 Key1 流式传输信息。 Function2 与 Function1 相同,但使用 Key2 代替。我希望这能澄清一点。

【问题讨论】:

  • 我认为这是不可能的。 Javascript 是单线程的,没有办法中断代码。超时函数从事件循环中运行,直到 Javascript 返回时才会运行。
  • 这将与 function1 和 function2 的作用有关;在被中断之前,它们是否有望成为无限期的功能?另外,重复之间是否有延迟?
  • function1 是否实际上无限期运行并需要停止(例如,它包含类似 while (true) 的内容),还是只需要重复调​​用它总共 9 秒(但是每次运行只需要很短的时间)?

标签: javascript timeout intervals


【解决方案1】:

JavaScript 不具备执行此类操作的功能。 (我不确定是否有任何语言)。解决方法如下:

let start = new Date().getTime();
while(new Date().getTime() - start < 9000) function1();
start = new Date().getTime();
while(new Date().getTime() - start < 1000) function2();

这是个坏主意,因为 Javascript 的“主”线程会在执行这项工作时卡住 10 秒。但是,如果您希望功能在时间还没有过去的情况下重复运行,您别无选择。也许您想将这些 while 放在函数中,但这取决于您。

我相信最好的方法是让一个网络工作者来执行这项任务。 web worker 不会冻结浏览器,所以它是一个更好的选择。

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API

如果您想编写更少的代码,您可以省略 getTime() 调用,因为 javascript 会将日期转换为减法操作发生时的毫秒数,但我相信显式方式更好(但我没有测试过它)。

【讨论】:

    【解决方案2】:

    我假设您的函数无需修改即可无限期地继续运行,如下所示:

    function1 () {
        while (true) { console.log("One more round"); }
    }
    

    您可能想要控制这些函数的运行时间,您可以通过测量函数内部执行轮次之间的时间轻松做到这一点:

    function1 () {
        var startTime = performance.now();
        while (performance.now() - startTime < 9000) { 
            console.log("One more round"); 
        }
    }
    

    这是co-operative multitasking 的一种形式。因为 JavaScript 本质上是单线程的,所以这将阻止其他所有内容的执行整整 9 秒。在数据处理领域,这是一个很长的时间。

    我建议您重构程序以依赖事件和计时器。

    为了获得更好的答案,您可以通过添加有关函数应该如何工作的信息来改进您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2022-10-18
      相关资源
      最近更新 更多