2015-06-13 2 views
1

У меня есть следующие функции:setInterval не очищен, функция продолжает получать казнены

function monitorClimate() { 

    var sensorReadingInterval; 

    function startClimateMonitoring(interval) { 

     sensorReadingInterval = setInterval(function() { 

      io.emit('sensorReading', { 
       temperature: sensor.getTemp() + 'C', 
       humidity: sensor.getHumidity() + '%' 
      }); 

     }, interval); 

     console.log('Climate control started!'); 

    } 

    function stopClimateMonitoring() { 
     clearInterval(sensorReadingInterval); 
     console.log('Climate control stopped!'); 
    } 


    return { 
     start: startClimateMonitoring, 
     stop: stopClimateMonitoring 
    }; 

} 

Я смотрю на кнопку для изменения состояния, как это:

button.watch(function(err, value) { 
    led.writeSync(value); 

    if (value == 1) { 
     monitorClimate().start(1000); 
    } else { 
     monitorClimate().stop(); 
    } 

}); 

Проблема заключается в том, что даже после вызова monitorClimate().stop(), setInterval продолжает запускаться, поэтому SocketIO продолжает излучать событие sensorReading.

Что я здесь делаю неправильно?

+0

Какой смысл вашего закрытия, если вы воссоздаете область действия, вызывая функцию каждый раз, когда используете свой API? Ваши разные вызовы просто не выполняются в одном и том же месте. Это разные функции, поэтому разные интервалы. –

+0

вам нужна служба исполнителя определенно, код грязный. –

+0

Спасибо, ребята! Я, очевидно, новичок, поэтому найти лучший образец часто бывает сложной задачей для меня. @RomanC можете ли вы указать мне некоторые материалы для чтения в службе исполнителей? Или, может быть, какой-то исходный код, реализующий его ... Простой поиск в Google привел меня к пакету NPM. Это то, о чем вы говорите? –

ответ

3

Каждый раз, когда вы вызываете monitorClimate(), вы создаете новый набор функций, поэтому monitorClimate().start() и monitorClimate().stop() не работают с одним и тем же интервалом. Попробуйте что-нибудь наподобие:

var monitor = monitorClimate(); 
button.watch(function(err, value) { 
    led.writeSync(value); 

    if (value == 1) { 
     monitor.start(1000); 
    } else { 
     monitor.stop(); 
    } 
}); 
+0

Большое спасибо @wezzy! Я переместил 'sensorReadingInterval' в 'глобальную' область, это вместе с вашим добавлением (захват экземпляра функции) заставило его работать. Я постараюсь подумать об этом лучше. Судя по комментариям по этому вопросу, это может быть неправильный подход. –

+0

Я рад, что это помогло вам :-) – wezzy

+1

Этот ответ ничего не исправить. Вы по-прежнему вызываете 'monitorClimate' каждый раз, когда кнопка нажата и создает новые функции' start'/'stop'. Изменение на 'sensorReadingInterval', являющееся глобальным, решило проблему самостоятельно. –

Смежные вопросы