Как заставить clearTimeout работать правильно, чтобы отменить (прервать) цикл setTimeout? - PullRequest
0 голосов
/ 26 марта 2019

Я использую Node.js для создания приложения, которое может считывать данные модуля USB LoRa и управлять выводами Raspberry Pi GPIO.

Существует три основных функции:

  1. Установить GPIO для включения (сигнал с контакта 0)

  2. Выключить GPIO (сигнал с контакта 1)

  3. Установить GPIO навыключить через некоторое время (используя функцию setTimeout)

Основные функции работают хорошо.

Проблема в том, что в цикле setTimeoutЯ хочу прекратить его в любое время.

Я пытался использовать clearTimeout для отмены цикла setTimeout, но, похоже, он не работает.Я что-то не так делаю?

Например.

Использование строки "TurnOn15s" в пакете, полученном LoRa.Я не могу прекратить время ожидания в любое время.Я должен ждать до конца 15 секунд, чтобы отключить контакты GPIO.Если я вызову функцию deviceTurnOff (1) во время выполнения тайм-аута, я получу два выхода после окончания цикла.

Вывод программы выглядит следующим образом:

// Output by `deviceTurnOn(0,15000)` from received LoRa packet.
Received:0, the solenoid valve has been opened!                                 
Received packet: !20!96 0 0 0 53 0 0 28 11 3 TurnOn15s RSSI: -40 SNR:   6

// Output by `setTimeout` function.
Received:1, the solenoid valve has been closed!                                 

// Output by deviceTurnOff(1) from received LoRa packet.
Received:1, the solenoid valve has been closed!                                 
Received packet: !18!96 0 0 0 53 0 0 29 9 3 TurnOff RSSI: -41 SNR:   7 

Здесьчастичный код:

var turnOffTimeout = null; // turnOffTimeout

// Control Raspberry Pi GPIO pins.
function deviceTurnOn(controlValueType, timeout) {

  // Do Turn On Raspberry Pi GPIO pins.
  if (timeout == -1) {

    // if no time string in the packet.
    console.log(`Received:${controlValueType}, the solenoid valve has been opened!`);
    OutputDevice.writeSync(controlValueType);
  } else {

    // if contains time string in the packet.
    console.log(`Received:${controlValueType}, the solenoid valve has been opened!`);
    OutputDevice.writeSync(controlValueType);
    turnOffTimer(timeout);
  }
}

// Control Raspberry Pi GPIO pins.
function deviceTurnOff(controlValueType) {

  // Do Turn Off Raspberry Pi GPIO pins.
  console.log(`Received:${controlValueType}, the solenoid valve has been closed!`);
  OutputDevice.writeSync(controlValueType);
  // clearTimeout
  if (turnOffTimeout) {
    clearTimeout(turnOffTimeout);
  }
}


// Raspberry Pi GPIO pins turn off timeout.
function turnOffTimer(timeout) {
  turnOffTimeout = setTimeout(function() {
    deviceTurnOff(1);
  }, timeout);
}

Содержит три функции: deviceTurnOn, deviceTurnOff, turnOffTimer

Формат вызова функции:

deviceTurnOff(1);
deviceTurnOn(0,timeout);

// Timeout is milliseconds

Обновление;

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

 var turnOffTimeout = null; // turnOffTimeout

    // Control Raspberry Pi GPIO pins.
    function deviceTurnOn(controlValueType, timeout) {
        // Do Turn On Raspberry Pi GPIO pins.

        if (timeout == -1) {

            // if no time string in the packet.
            console.log(`Received:${controlValueType}, the solenoid valve has been opened!`);
            OutputDevice.writeSync(controlValueType);
        }
        else {

            // if contains time string in the packet.
            console.log(`Received:${controlValueType}, the solenoid valve has been opened!`);
            OutputDevice.writeSync(controlValueType);
            // clearTimeout.
            clearTimeout(turnOffTimeout);
            // set new timeout.
            turnOffTimeout = setTimeout(function () {
                deviceTurnOff(1);
            }, timeout);
        }
    }

    // Control Raspberry Pi GPIO pins.
    function deviceTurnOff(controlValueType) {

        // Do Turn Off Raspberry Pi GPIO pins.
        console.log(`Received:${controlValueType}, the solenoid valve has been closed!`);
        clearTimeout(turnOffTimeout);
        OutputDevice.writeSync(controlValueType);

    }

1 Ответ

2 голосов
/ 26 марта 2019

Убедитесь, что вы сбрасываете время при запуске и остановке, вам также не нужно проверять, установлен ли тайм-аут. Кроме того, в действительности нет необходимости в третьей функции только для отмены таймера, поскольку clearTimeout уже существует:

var timeout;
var timeout_ms = 10000;

var stop = function(){
 clearTimeout(timeout);
 turnOff();
}

var start(){
 clearTimeout(timeout); // clear existing t/o just in case
 timeout = setTimeout(turnOff,timeout_ms);
 turnOn();
}
...