2016-03-07 211 views
0

我對節點很陌生,並且在繞回調時遇到了一些麻煩。回調事件監聽器

我想用單個函數來打開一個組件的連接,或者關閉它,這取決於它的當前狀態。

if(state){ 
    component.open(function(){ 
     component.isOpen(); //TRUE 
    }); 
} 
else{ 
    component.isOpen(); //Always false 
    component.close(); //Results in error, due to port not being open 
} 

基本上我想在關閉連接之前等待一段時間,但我想用我的單一切換功能來關閉它。從我所看到的,保證港口開放的唯一方法是從回調內部。有沒有辦法讓回調監聽某種事件發生?還是有其他一些常見的做法可以在回調中接受輸入嗎?

回答

0

回調意味着被調用一次,而事件在那裏調用需求的方法'可以這麼說'多次,你的用例在我看來就像你想打開和關閉連接按需和多次...

爲此,最好使用EventEmitter,它是nodejs的一部分,非常易於使用。

例如:

var EventEmitter = require('events').EventEmitter; 

var myEventEmitter = new EventEmitter(); 
myEventEmitter.on('toggleComponentConnection', function() { 
    if (component.isOpen()) { 
     component.close(); 
    } 
    else { 
     component.open(function(){ 
     component.isOpen(); //TRUE 
     }); 
    } 
}); 

... 
// Emit your toggle event at whatever time your application needs it 
myEventEmitter.emit('toggleComponentConnection'); 

否則,如果您選擇使用回調,你需要牢記的功能範圍和JavaScript closures

function toggleComponentConnection(callback) { 
    if (component.isOpen()) { 
     component.close(function() { 
      callback(); 
     }); 
    } 
    else { 
     component.open(function(){ 
     component.isOpen(); //TRUE 
     callback(); 
     }); 
    } 
} 

... 
// Call your toggle function at whatever time your application needs it 
toggleComponentConnection(function() { 
    component.isOpen(); 

    // make sure your application code continues from this scope... 
}); 
+0

回調不必只被調用一次。查看'.forEach()'數組。它將它稱爲數組中每個元素的回調函數。 – jfriend00

+0

我並不是說要(而不是)說他們必須被調用一次,只是指出,當客戶端需要被通知一個完成的工作時,它們被使用。批量操作是另一種用法,並不涉及它似乎的問題 –

+0

我剛剛回答了你的答案,這只是不正確的第一句話。 – jfriend00