2013-09-23 72 views
4

我正在編寫一個node.js應用程序以幫助自動化我的一些家庭啤酒廠。我正在使用的模塊之一是PID算法來控制輸出,以便它們保持某些設定點。我目前正在通過while循環做這件事,但我認爲這段代碼會被阻塞。任何幫助使這個更有效和異步將不勝感激。這裏是我的控制迴路:如何在Node.JS中編寫異步while循環

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。這取出了循環,並應該幫助CPU加載,因爲pid代碼只在輸入改變時才運行。謝謝您的幫助! – JoshPeltier