Как остановить бесконечный L oop в Node.js / Javascript - PullRequest
2 голосов
/ 31 марта 2020

Если мы запустили 2 параллельных бесконечных цикла, используя worker('hello') и worker('world'), как мы можем позже остановить один из циклов?

Например:

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)
})();

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Вы не можете остановить эти циклы worker() вне функции. Javascript не имеет такой возможности.

Вам понадобятся эти циклы для проверки чего-либо, находящегося за пределами l oop (переменная или вызывающая функция или что-то подобное), чтобы вы могли влиять на них.

Есть много других способов записать l oop, на который может влиять внешний мир.

Некоторые примеры:

  1. Используйте setInterval() и получите интервал timerID из функции. Затем вы можете вызвать clearInterval(), чтобы остановить l oop.

  2. Создать небольшой объект, где ваш l oop - это один метод, и этот l oop протестирует переменная экземпляра, которую вы можете изменить извне.


PS Могут быть некоторые хаки, когда вы заменяете Promise конструктором, который вызовет отклонение, что приведет к await бросить и затем содержать async функцию для отклонения в следующем цикле, но я предполагаю, что вы не ищете этот уровень взлома и вторжения в окружение.

Так как sleep() объявлен как const вы не можете взломать замену, которая отвергнет.

1 голос
/ 31 марта 2020

Если единственное, что вы хотите сделать с помощью функции worker, это повторять какое-то действие каждые N миллисекунд, я предлагаю использовать setInterval объясненное здесь

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...