我想用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'事件。如何获得正确的价值?
我想的时间越长,我认为我不应该支持get函数,而poller也会触发此dataReceived事件。
答案 0 :(得分: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);
}