回调获取功能与事件驱动设计相结合

时间:2013-04-22 14:07:00

标签: javascript node.js listener event-driven

我想用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事件。

1 个答案:

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