2016-06-28 31 views
1

Noobish here。重複調用嵌入在init函數中的函數

我正在建設覆盆子pi項目,每5分鐘測量一個水箱的深度。我已經在坦克中放置了一個超聲波距離測量儀,並且已經使用節點和r-pi-usonic庫運行了所有的程序。我可以對超聲波設備進行初始調用,以創建平均10個單獨的度量(因爲各個度量的變化)並將其記錄到控制檯。

但我想要做的是每5分鐘重複一次。我最初嘗試通過設置setInterval()來完成此操作,並嘗試使用cron。但是,隨着查詢循環在init函數捆綁起來,它引發以下錯誤......

timers.js:274 
callback.apply(this, args); 
     ^
TypeError: Cannot read property 'apply' of undefined 
at wrapper [as _onTimeout] (timers.js:274:13) 
at Timer.listOnTimeout (timers.js:119:15) 

所以我的問題是真的是什麼讓這個運行查詢每5分鐘的最佳方式?答案無疑會幫助我理解回調等。對不起,這樣的傻瓜!

我的代碼在這裏,爲它的廢話道歉!

//Import required modules 

var usonic = require('r-pi-usonic'); 
console.log('starting water tank monitor'); 
var min_tank = 30 
var max_tank = 90 
var tank_percent = 0 

usonic.init(function (error) { 
    if (error) { 
     console.log('Error') 
    } else { 
     var sensor = usonic.createSensor(13, 21, 1000); 
     var i = 0 
     var values = 0 
     function myLoop(){ 
      setTimeout(function() {  
       var v = sensor().toFixed(2) ; 
       values = values+parseFloat(v); 
       i++;      
       if (i < 10) {    
        myLoop();    
       } else { 
        value = (values/10).toFixed(2)     
        tank_percent = 100 -((value - min_tank)/ (max_tank - min_tank) * 100) 
        console.log(tank_percent); 
        i = 0; 
        values = 0; 
       }      
      }, 500) 
     }; 
    setInterval (myLoop(), 30000);  
    } 
}); 

回答

1

我的眼睛流血時,我看到(開個玩笑):

setInterval (myLoop(), 30000); 

請注意,您在setInterval中打電話給myLoop。以目前的方式,您立即致電myLoop(),只需一次。您應該提供對您的myLoop函數的參考。

setInterval (myLoop, 30000); 

一旦你正確使用setInterval,你會不會用你setTimeout內的myLoop因爲setInterval是異步..

+1

謝謝 - 我的字面意思是要在一塊石頭下爬行,永遠不會再出來 – user2870492

0

你不應該叫myLoop當你把它作爲一個參數setInterval,看到doc

function myLoop(){ 
    setTimeout(function() {  
     var v = sensor().toFixed(2) ; 
     values = values+parseFloat(v); 
     i++;      
     if (i < 10) {    
      myLoop();    
     } else { 
      value = (values/10).toFixed(2)     
      tank_percent = 100 -((value - min_tank)/ (max_tank - min_tank) * 100) 
      console.log(tank_percent); 
      i = 0; 
      values = 0; 
     }      
    }, 500) 
}; 
setInterval (myLoop, 30000);  
0

謝謝!我要爬到一塊石頭下,永遠不會再出來。