Javascript 回调get函数与事件驱动设计相结合

Javascript 回调get函数与事件驱动设计相结合,javascript,node.js,listener,event-driven,Javascript,Node.js,Listener,Event Driven,我想制作一个带有get函数的API(node.js)。我使用的模块支持写操作,所有传入的数据都由我也可以订阅的事件发出。底层系统基于轮询 但我还想添加写入的轮询器(使用setInterval)。当我添加一个请求rpm的侦听器时,我每秒都会得到rpm信息。当我同时调用vss的get时,data.name和type可能不匹配。现在这把我的计划搞砸了 那么,基本上,我可以在else块中填充什么,什么是最佳实践?或者这整个设计是一个糟糕的做法?在这种情况下是否应该不支持get function get(

我想制作一个带有get函数的API(node.js)。我使用的模块支持写操作,所有传入的数据都由我也可以订阅的事件发出。底层系统基于轮询

但我还想添加写入的轮询器(使用setInterval)。当我添加一个请求rpm的侦听器时,我每秒都会得到rpm信息。当我同时调用vss的get时,data.name和type可能不匹配。现在这把我的计划搞砸了

那么,基本上,我可以在else块中填充什么,什么是最佳实践?或者这整个设计是一个糟糕的做法?在这种情况下是否应该不支持get

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获取正确的值


我想得越久,就越不应该支持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);
}