【问题标题】:How to break a nodejs for loop if the execution takes more than 20 seconds?如果执行时间超过 20 秒,如何打破 nodejs for 循环?
【发布时间】:2022-01-11 16:46:04
【问题描述】:

假设我有一个执行某些操作的 forloop。如果执行时间超过 20 秒,我想打破 for 循环。

async function mainFunc(){

    for (let step = 0; step < 5; step++) {
        // Runs some complex operation that is computationally intensive
        //someFunc() is a async method. SomeAnotherFunc() is a synchronous one.
        await someFunc();
        someAnotherFunc();//this function contains built in function 
        // execSync() that runs command line functions 
        await someFunc(); 
 
    }
}

谁能给我一个简单的解决方案,让我在单独的线程上跟踪时间和中断循环,这样我就不会负担现有的 for 循环执行?

这个答案部分适用于我。 @Molda 给出的解决方案只会在异步方法的情况下帮助我。如果你看到我提供的代码 sn-p,有一个名为 someAnotherFunc() 的同步方法,它有一个运行命令行函数的 nodejs 进程函数“execSync”。现在跟踪这个函数的时间对我来说实际上是一个痛点,因为我无法访问该方法,因为它是一个内置函数。非常感谢您对如何进一步提出建议。

【问题讨论】:

  • JS 是单线程的
  • 你试过什么?你的console.log 怎么会花 20 秒?
  • 我在 for 循环中显示的代码不是实际代码。在 for 循环中,有一个方法可以执行一些操作来处理一些数据,并且这个处理在某些情况下需要超过 20 秒。
  • execSync,这总是一个问题,我会使用exec,版本。您可以轻松地将其转换为承诺,然后超时将再次起作用。如果 20 秒过去了,甚至可以在进程上调用 kill
  • @Keith 在我遵循您的建议后,问题终于解决了。使用 Exec 而不是 Execsync 并与它一起使用 promise,我将它包装在一个超时函数中。看起来像一个巧妙的解决方案。非常感谢你

标签: javascript node.js express timer


【解决方案1】:

应该很简单

var stop = false;
setTimeout(()=>{ stop = true; }, 20 * 1000);

for (let step = 0; step < 5; step++) {
    if (stop) break;
}

注意:

没有 async/await 的 for 循环是同步的,这意味着即使调用多个请求/db 调用/等,for 循环完成只需要不到一秒钟的时间。所以我无法想象你会在 20 秒内做什么

【讨论】:

  • @user9683713 好吧,这是一个非常简单的解决方案,所以有些人可能会认为您还没有足够努力地自己解决这个问题。我很高兴能帮上忙。
  • 现在说得通了。无论如何,非常感谢。
  • 您能否再次检查我编辑的详细信息,您的答案部分有效,因为我尝试跟踪的功能已内置功能。这就是为什么我一直在努力寻找解决方案,尽管它看起来很简单。
  • 好吧,除非你能告诉我 someAnotherFunc 的代码,否则我帮不了你。如果它只包含 execSync 则应该没有问题,因为顾名思义它是同步的。
  • 好吧,我将 Exec 与 promise 一起使用,并将其包装在超时函数中,效果很好。
【解决方案2】:

您是否尝试过在 for 循环中添加一个计时器,并在它完成 20 秒时中断?

How to do a timer in Angular 5
https://www.w3schools.com/js/js_break.asp

类似这样的:

var stopTimer = false;
setTimeout(() => {
    stopTimer = true;
}, 20 * 1000);

for (let step = 0; step < 5; step++) {
    if (stopTimer) break;
}

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多