我使用node-red并在使用websockets连接到设备并从中请求数据时开发自定义节点。
function query(node, msg, callback) {
var uri = 'ws://' + node.config.host + ':' + node.config.port;
var protocol = 'Lux_WS';
node.ws = new WebSocket(uri, protocol);
var login = "LOGIN;" + node.config.password;
node.ws.on('open', function open() {
node.status({fill:"green",shape:"dot",text:"connected"});
node.ws.send(login);
node.ws.send("REFRESH");
});
node.ws.on('message', function (data, flags) {
processResponse(data, node);
});
node.ws.on('close', function(code, reason) {
node.status({fill:"grey",shape:"dot",text:"disconnected"});
});
node.ws.on('error', function(error) {
node.status({fill:"red",shape:"dot",text:"Error " + error});
});
}
在processResponse
函数中,我需要处理第一个响应。它给了我一个带有几个ID的XML,我需要它来请求更多的数据。
我计划建立一个结构来保存第一个请求中的所有数据,并使用id请求产生的数据进一步填充它。
这就是我的问题开始的地方,每当我从processResponse
函数中发送查询时,我触发一个事件导致同一个函数再次被调用,但后来我的结构为空。
我知道这是由于nodejs和事件系统的异步性质,但我根本没有看到如何绕过这种行为或以正确的方式执行我的代码。
如果有人可以推荐如何处理这类情况的例子,或者甚至更好的举例,那就太棒了!