JS-用于带有预设变量的循环



我的第一篇文章。我搜索了这个论坛和互联网,但直到现在我还没有找到解决方案。

我正在创建一个带有树莓πzero的relais面板。我使用socket.io将前端与node.js连接。这是我在服务器端的代码:

var io = require("socket.io")(server);
var emitName = ['one', 'two', 'three', 'four', 'five', 'six', 'seven'];
var pinNumber = ['4', '17', '27','22','18','23','24']
io.on('connection', function(socket) {
for (var i=0, len=emitName.length; i<len; i++) {
const RELAY = new Gpio(pinNumber[i], 'out')
var relayOne = 0; //static variable for current status
socket.on(emitName[i], function(data) { //get light switch status from client
relayOne = data;
if (relayOne != RELAY.readSync()) { //only change LED if status has changed
RELAY.writeSync(relayOne); //turn LED on or off
}
});
}
});

我面临的问题是当我刷新浏览器时。继电器状态重置。这是因为我在for循环中定义了new Gpio(pinNumber[i], 'out')。如果我把它拿出来,一切都如预期的那样。但是,我怎么能让for循环每次运行不同的继电器(树莓针(时都被占用呢?

希望这是有道理的。非常感谢,干杯!

根据我从你的问题中收集的信息,我将其理解为:

  1. 您希望GPIO引脚的初始化发生在环路之外,这样每次进行新连接时都不会重置
  2. 您希望在初始化移动到循环之外之后仍然能够寻址正确的引脚

我的建议如下:

const io = require("socket.io")(server);
const eventToGpio= {
'one': new Gpio(4, 'out'),
'two': new Gpio(17, 'out'),
'three': new Gpio(27, 'out'),
'four': new Gpio(22, 'out'),
'five': new Gpio(18, 'out'),
'six': new Gpio(23, 'out'),
'seven': new Gpio(24, 'out')
};
io.on('connection', function(socket) {
Object.entries(eventToGpio)
.forEach(function([event, relay]) {
socket.on(event, function(data) {
if(data != relay.readSync()) {
relay.writeSync(data);
}
});
});
});

GPIO引脚的初始化已移动到环路之外,因此它们只初始化一次。

每次建立新连接时,事件处理程序都会在不重新初始化GPIO引脚的情况下进行注册,但仍会映射到正确的引脚。

我去掉了上面代码示例中的relayOne变量,因为我没有看到它的用途

最新更新