2015-06-13 81 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你能指點我一些Executor服務上的閱讀材料嗎?或者,也許一些源代碼實現它...簡單的谷歌搜索導致我一個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'移到了'global'範圍,隨着你的添加(抓取函數的一個實例),它使它工作。我會試着想一個更好的模式。從這個問題的評論來看,這可能不是正確的做法。 –

+0

我很高興,這有助於你:-) – wezzy

+1

這個答案不能解決任何問題。每次按下按鈕時,您仍然調用'monitorClimate'並創建新的'start' /'stop'功能。對全局'sensorReadingInterval'的更改自行解決了問題。 –