【问题标题】:How to create an infinite loop in NodeJS如何在 NodeJS 中创建无限循环
【发布时间】:2017-08-06 11:45:35
【问题描述】:

我在 JS 上看到了一堆关于无限循环的答案,我认为这会对我的代码有所帮助,但它似乎无法正常工作。 我有那个:

var i = 0

while (true) {
  setTimeout(() => {
    i ++
    console.log('Infinite Loop Test n:', i);
  }, 2000)
}

目标是在无限循环中每 2 秒获取一次日志,但我似乎无法取回任何东西......我在哪里弄错了?

提前感谢您一如既往的帮助!

【问题讨论】:

    标签: node.js loops while-loop settimeout


    【解决方案1】:

    你为什么想要一个while循环?要么使用setInterval,要么(更好)创建一个在超时后再次调用自身的函数:

    function logEvery2Seconds(i) {
        setTimeout(() => {
            console.log('Infinite Loop Test n:', i);
            logEvery2Seconds(++i);
        }, 2000)
    }
    
    logEvery2Seconds(0);
    
    let i = 0;
    setInterval(() => {
        console.log('Infinite Loop Test interval n:', i++);
    }, 2000)

    【讨论】:

    • 嘿Baao!非常感谢您的回答!一个简单的问题:为什么有一个回调函数而不是 setInterval 更好?
    • 恕我直言,它的可控性更好,@Ardzii 在这种情况下,您也会更准确,因为下一次超时仅在函数的其余部分运行后安排。
    • 考虑到递归永远不会结束,有谁知道第一个解决方案是否不会使调用堆栈膨胀?使用安全吗?或者每隔一周我会看到这个过程崩溃?
    • @ZzAntáres 接受的解决方案不会添加到堆栈中。如果您在循环函数中添加console.trace(),您可以看到这一点。您会注意到堆栈没有增长。对不使用 setInterval 或 setTimeout 的函数执行相同操作,您可以看到堆栈跟踪每次迭代都在增长。
    【解决方案2】:

    您要查找的函数是 setInterval,可以这样使用: setInterval(callback, millis)

    【讨论】:

      【解决方案3】:
      var x = true;
      while(x){
         console.log("In loop")
      }
      

      【讨论】:

      • 那延迟呢? while true 已经存在问题了!
      【解决方案4】:

      下面是一个 TypeScript 实现和使用的例子:

      interface ILoopContext<T> {
        data: T;
        state: "RUNNING" | "PAUSED";
      }
      
      function loop<T>(
        interval: number,
        context: ILoopContext<T>,
        func: (options: { data: T; start: () => void; stop: () => void }) => void
      ) {
        const stop = () => context.state = "PAUSED";
        const start = () => context.state = "RUNNING";
      
        setTimeout(() => {
          if (context.state === "RUNNING") {
            func({ data: context.data, start, stop });
          }
      
          loop(interval, context, func);
        }, interval);
      
        return { start, stop };
      }
      
      loop(1000, { state: "RUNNING", data: { counter: 0 } }, (options) => {
        const { stop, data } = options;
        data.counter += 1;
        console.log(data.counter);
        if (data.counter == 10) {
          stop();
        }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-17
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多