回调获取函数与事件驱动设计相结合
问题描述:
我想用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);
}