0

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

由于不同变量(rpm/vss)上的轮询器,可以发出更多的“dataReceived”事件。如何获得正确的 get 值?

我想得越久,我就越认为我不应该支持 get 函数,而这个 dataReceived 事件也是由轮询器触发的。

4

1 回答 1

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);
}
于 2013-04-23T07:47:31.923 回答