繁体   English   中英

如何在 Node.js/Javascript 中停止无限循环

[英]How To Stop An Infinite Loop in Node.js/Javascript

如果我们使用worker('hello')worker('world')启动了 2 个并发的无限循环,我们以后如何停止其中一个循环?

例如:

const sleep = async function (duration) {
    await new Promise(r => setTimeout(r, duration));
}

const worker = async (id) => {
    while (true) {
        console.log(id);
        await sleep(2000);  // simulates a blocking call
    }
}

(async () => {
    const hello = worker('hello')
    const world = worker('world')

    // Let's assume that now a user-input requires us to stop the `worker('hello')`
    setTimeout(() => {
        console.log('stopping hello...')\
        // how to stop 'hello'?
    }, 5000)
})();

您无法从函数外部停止那些worker()循环。 Javascript 没有这种能力。

您需要这些循环来检查循环外的内容(变量或调用函数或类似的东西),以便您能够影响它们。

还有许多其他方法可以编写可以受外部世界影响的循环。

一些例子:

  1. 使用setInterval()并从函数返回间隔 timerID。 然后,您可以调用clearInterval()来停止循环。

  2. 创建一个小对象,其中您的循环是一种方法,并让该循环测试您可以从外部更改的实例变量。


PS 可能有一些技巧,你用构造函数替换Promise会强制拒绝,这会导致await抛出,然后包含async函数在下一个周期拒绝,但我假设你不是在寻找那种级别的 hack和环境的入侵。

由于sleep()被声明为const您无法替换它会拒绝的替代品。

如果您想要对worker函数做的唯一一件事是每 N 毫秒重复一些操作,我建议使用setInterval解释here

function worker(id) {
    return setInterval(() => {//loop actions inside this annonymous function
        console.log(id);
        //Anything else

    }, 2000);//Every 2000 milliseconds
}

//make a loop active
const intervalHello = worker(`Hello`);
//stop the interval
clearInterval(intervalHello);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM