Как использовать циклы для задач с интервалами?

#javascript #loops #websocket #raspberry-pi

#javascript #циклы #websocket #raspberry-pi

Вопрос:

Итак, мой вариант использования заключается в том, что я хочу управлять шаговым двигателем через Raspberry Pi. Этот элемент управления должен работать через веб-сокет с Socket.io и также пока работает довольно хорошо.

Теперь я хочу запустить свой двигатель с помощью одного вызова веб-сокета, а также остановить его одним-единственным вызовом.

Мой код на данный момент таков:

 var looping;
    socket.on('start looping', function() {
        console.log("Start looping");
        var pin = 40;

        rpio.open(pin, rpio.OUTPUT, rpio.LOW);

        looping = setInterval(function(){
            for(var i = 1; i < 100; i  ){
            rpio.write(pin, rpio.HIGH);
            rpio.sleep(0.001);
            rpio.write(pin, rpio.LOW);
        }
        },1);

    });

    socket.on('stop looping', function() {
        console.log("Stop looping");
        clearInterval(looping);
    });
  

Как вы видите, я использую setInterval с интервалом в 1 мс, и внутри моего цикла я включаю и выключаю свой вывод с интервалом в 0,001 секунды.

Эти два интервала действительно беспокоят меня, и я хотел бы использовать один интервал, чтобы я мог более точно управлять своим двигателем.

Возможно, я делаю это неправильно. Не могли бы вы, пожалуйста, дать мне какую-нибудь помощь или совет, как я могу решить это более элегантно?

Заранее спасибо!

РЕДАКТИРОВАТЬ: Хорошо… Я немного переформатирую свой вопрос: прежде чем я попытался выполнить свой запуск и остановку следующим образом:

 var running = true

socket.on('start looping', function() {
        console.log("Start looping");
        var pin = 40;

        rpio.open(pin, rpio.OUTPUT, rpio.LOW);

        while(running){
            rpio.write(pin, rpio.HIGH);
            rpio.sleep(0.001);
            rpio.write(pin, rpio.LOW);
        }

socket.on('stop looping', function() {
        console.log("Stop looping");
        running = false
    });
  

Но поскольку while цикл препятствовал обработке другого вызова сокета, мне пришлось использовать setInterval . Возможно, это поможет немного лучше понять мой вариант использования и проблему.

Комментарии:

1. Обратите внимание, что setInterval не собирается ждать асинхронного кода внутри него. Также он имеет минимальную задержку в зависимости от среды. Например, в браузерах я думаю, что это около 4 мс, независимо от того, передается ли ему меньшее значение, или нет значения, или ноль

2. @charlietfl таким образом, вы говорите, что мой setInterval выполняется каждые 1 мс, независимо от того, сколько времени требуется для завершения моего цикла for внутри? Это делает мой подход еще хуже в том смысле, что у меня нет точного контроля над моим сигналом в гц, и я ищу лучший способ решить эту проблему.