2013-09-23 2 views
4

Я пишу приложение node.js, чтобы помочь автоматизировать некоторые из моих домашних пивоваренных заводов. Одним из модулей, которые я использую, является PID-алгоритм для управления выходами, чтобы они поддерживали определенные заданные значения. В настоящее время я делаю это через цикл while, но думаю, что этот код будет блокировать. Любая помощь, помогающая сделать это более эффективной и асинхронной, была бы весьма признательна. Вот мой контур управления:Как написать асинхронный цикл while в Node.JS

device.prototype.pid_on = function(){ 
    while(this.isOn){ 
     this.pid.set_target(this.target); // make sure that the setpoint is current 
     var output_power = this.pid.update(this.current_value); // gets the new output from the PID 
     this.output.set_power(output_power); 
    }; 
}; 

Я изменил его немного для удобства чтения, но это в основном это. Он будет просто контуром, отрегулировать выход, а затем передать новое значение ввода. Я хочу, чтобы цикл продолжал работать до тех пор, пока устройство не выключится.

Очевидно, мне нужно, чтобы это было неблокируемым, чтобы я мог продолжать управлять другими устройствами во время работы pid.

В настоящее время я просто называю эквивалентом device.pid_on(); в моем коде.

Одна из моих идей - использовать пустой обратный вызов, что бы сделать это не блокирующим?

device.prototype.pid_on(calback){ 
    while (this.isOn){...}; 
    callback(); 
}; 

//call later in code 
device.pid_on(function(){}); 

Спасибо за любую помощь!

ответ

2

Лучше избегать цикла while.

device.prototype.pid_on = function() { 
    var that = this; 
    if (this.isOn) { 

    ... do stuff 

    process.nextTick(function() { 
     that.pid_on(); 
    }); 
    } 
}; 

Или

device.prototype.pid_on = function() { 
    var that = this; 
    if (this.isOn) { 

    ... do stuff 

    setTimeout(function() { 
     that.pid_on(); 
    }, 0); 
    } 
}; 
+0

Да, я думал о том, что хорошо. Я просто реорганизовал код так, чтобы, если устройство включено, pid_on вызывается всякий раз, когда получает новое входное значение. Это выдает цикл и должно помочь с загрузкой процессора, поскольку код pid запускается только при изменении ввода. Спасибо за помощь! – JoshPeltier

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