JS - 带有预设变量的for循环

JS - for loop with preset variables

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

我正在创建一个带有一些 raspberry pi 零继电器的面板。我使用 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 循环每次运行不同的中继 (raspberry pin)?

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

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

  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 变量,因为我没有看到它的用途。