2016-06-28 5 views
1

ここにNoobish。init関数に埋め込まれた関数を繰り返し呼び出す

私は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) 

だから私の質問は、これは、クエリごと5minsを実行するために取得するための最良の方法は何か本当に?答えは間違いなくコールバックなどの私の理解を助けるでしょう。そのようなダンスであることを申し訳ありません!

私のコードはここにあります。

//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); 

どのようにmyLoopsetIntervalに呼び出しているかに注目してください。現在の方法では、すぐにmyLoop()に電話します。代わりに、myLoop関数への参照を与える必要があります。

setInterval (myLoop, 30000); 

あなたは正しくsetIntervalを使用したら、

+1

ありがとうございます - 私は文字通り石の下を這うことになり、決して再び出てこない – user2870492

0

私は(冗談)を見ると出血、あなたがsetIntervalにパラメータとして渡すときmyLoopを呼び出す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

はありがとう.. setIntervalが非同期であるため、あなたのmyLoop以内にあなたのsetTimeoutを使用する必要はありません!私は岩の下を這うつもりで、再び出てこないだろう。

関連する問題