2016-06-28 3 views
1

Noobish здесь.Повторное вызов функции, встроенной в функцию init

Я создаю проект pulberry pi для измерения глубины емкости для воды каждые 5 минут. Я поместил в танк ультразвуковое расстояние и получил все, что работает, используя узел и библиотеку r-pi-usonic. Я могу сделать первоначальный вызов ультразвукового устройства, чтобы создать в среднем 10 индивидуальных мер (из-за изменчивости отдельных мер) и записать их на консоль.

Но я хочу повторить это каждые 5 минут. Сначала я попытался сделать это, установив setInterval() и попытался использовать cron. Но поскольку цикл запроса связан в функции инициализации, он выдает следующее сообщение об ошибке ...

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

Обратите внимание, как вы звоните myLoop в setInterval. С помощью этого текущего способа вы вызываете myLoop() мгновенно и только один раз. Вместо этого вы должны указывать ссылку на свою функцию myLoop.

setInterval (myLoop, 30000); 

После того, как вы использовали setInterval правильно, вы не должны использовать ваш setTimeout в вашей myLoopsetInterval поскольку асинхронный ..

+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

Спасибо! Я собираюсь ползать под скалой и больше не выйду.

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