2014-10-12 2 views
3

В приведенном ниже скрипте я планирую, чтобы мой сценарий опросил устройство (домашняя автоматизация) для статуса. Я хочу делать это каждые 5 секунд. Когда я запускаю скрипт без цикла (setInterval), он работает нормально. С петлей он работает отлично в первый раз. Во второй раз я получаю сообщение об ошибке. Im работает скрипт с node.jssetInterval, дающий мне TypeError: не может вызвать метод 'apply' of undefined

Первый сценарий:

//import node module request 
var request = require('request'); 

//function to get status of a device 
function wrapper (url, device, filter, service) { 
request(url, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     obj = JSON.parse(body); 
     for (var i = 0; i < obj[device].states.length; i++) { 
      if (obj[device].states[i].service === service && obj[device].states[i].variable === filter) { 
       deviceStatus = obj[device].states[i].value; 
       console.log("deviceStatus inside function: " + deviceStatus); 
       //call the compareTime function 
       compareTime(deviceStatus); 
      } 
     } 
    } 
    return 3; 
}); 
}; 

function compareTime() { 
    var hour = new Date().getHours(); 
    console.log(hour); 
     if (8 <= hour && hour <= 21) { 
      //var deviceStatus = 0; 
      console.log("deviceStatus :" + deviceStatus); 
      if (deviceStatus === '1') { 
       request('url', function (error, response, body) { 
       if (!error && response.statusCode == 200) { 
       } 
       }) 
       request('url', function (error, response, body) { 
       if (!error && response.statusCode == 200) { 
       } 
       }) 
      } else { 
       console.log("deviceStatus :" + deviceStatus); 
      } 
     } else { 
      console.log("deviceStatus :" + deviceStatus); 
     } 
}; 


loop = wrapper('url', 'Device_Num_21', 'Status', 'urn:upnp-org:serviceId:SwitchPower1'); 

//call the function wrapper with arguments 
setInterval(loop, 5000); 

Ошибка:

node stack.js 
deviceStatus inside function: 1 
21 
deviceStatus :1 

timers.js:261 
    callback.apply(this, args); 
      ^
TypeError: Cannot call method 'apply' of undefined 
    at wrapper [as _onTimeout] (timers.js:261:14) 
    at Timer.listOnTimeout [as ontimeout] (timers.js:112:15) 

Может кто-нибудь, пожалуйста, помочь мне в этом?

ответ

10

setInterval() ожидает, что ее первый аргумент, чтобы быть function, который loop может быть определен как:

function loop() { 
    wrapper('url', 'Device_Num_21', 'Status', 'urn:upnp-org:serviceId:SwitchPower1'); 
} 

setInterval(loop, 5000); 

ошибка происходит потому, что в настоящее время loop держит undefined value, который не может рассматриваться как функция или объект со свойствами как setInterval() ожидает.

Это значение возвращается с wrapper(), который в настоящее время вызывается немедленно.

+0

Это довольно блестящий. Действительно работает как прелесть. Благодарим вас за краткое и ясное объяснение. Мне очень жаль, что я еще не смог проголосовать за ваш вклад. Благодаря! – Carnifex

+0

Это очень полезно знать - спасибо! – HHHH

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