回调获取函数与事件驱动设计相结合

问题描述:

我想用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); 
} 

'dataReceived'事件可能因为不同变量(rpm/vss)上的轮询器而发出更多。如何为获得正确的价值?

我考虑的时间越长,我认为我不应该支持get函数,而这个dataReceived事件也是由轮询器触发的。

解决了它。有一场比赛时,我正在移除听众,而且我不再使用一次。

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); 
}