2013-04-22 2 views
0

get 함수로 API (node.js)를 만들고 싶습니다. 내가 사용하는 모듈은 쓰기를 지원하며 모든 수신 데이터는 내가 구독 할 수있는 이벤트에 의해 방출됩니다. 기본 시스템은 폴링을 기반으로합니다.콜백 함수와 이벤트 구동 형 디자인의 결합

하지만 (setInterval을 사용하여) 쓰는 폴러도 추가하고 싶습니다. rpm을 요청하기 위해 리스너를 추가 할 때마다 매초 RPM 정보를 얻습니다. vss에 대해 동시에 get을 호출하면 data.name과 type이 일치하지 않을 가능성이 있습니다. 그리고 그것은 지금 당장 나가 버린다.

기본적으로 else 블록을 어떻게 채울 수 있습니까? 그리고 모범 사례는 무엇입니까? 아니면 전체 디자인이 나쁜 습관입니까? 이 경우에는 지원을 받아야합니까?

function get(type, callback) { 
    sp.once('dataReceived', function (data) { 
     if(data.name === type) { 
      switch (data.name) { 
       case "rpm": 
        callback(new RPMEvent(data.value)); 
        break; 
       case "vss": 
        callback(new SpeedEvent(data.value)); 
        break; 
       default: 
        console.log('Not supported yet.'); 
        break; 
      } 
     } else { 
      console.log('Collision with poller and get. Not supported yet.'); 
      //What to do here? I should addlistener again? 
     } 
    }); 

    sp.requestValueByName(type); 
} 

다른 변수 (rpm/vss)의 폴러로 인해 'dataReceived'이벤트가 더 많이 생성 될 수 있습니다. 얻을 수있는 적절한 가치를 얻는 방법?

더 이상 생각해 보면,이 dataReceived 이벤트가 폴러에 의해 트리거되는 동안 get 함수를 지원하면 안된다는 생각이 많이 듭니다.

답변

0

해결했습니다. 나는 경기가있을 때 청중을 제거하고, 나는 한 번 더 사용하지 않고있다.

function get(type, callback) { 
    var getMessageHandler = function (data) { 
     if(data.name === type) { 
      switch (data.name) { 
       case "rpm": 
        callback(new RPMEvent(data.value)); 
        break; 
       case "vss": 
        callback(new SpeedEvent(data.value)); 
        break; 
       default: 
        console.log('Not supported yet.'); 
        break; 
      } 
      this.removeListener('dataReceived', getMessageHandler); 
     } else { 
      console.log('Collision with listener and get. Not supported yet.'); 
      //Do nothing, let the next thing come in. Will be caught by generalHandler. 
     } 
    }; 

    sp.on('dataReceived', getMessageHandler); 

    //Request value after callback. 
    sp.requestValueByName(type); 
} 
관련 문제