Цикл JS — for с предустановленными переменными

#javascript #node.js #socket.io #raspberry-pi

#javascript #node.js #socket.io #raspberry-pi

Вопрос:

Мой первый пост. Я искал этот форум и Интернет, но до сих пор не нашел решения.

Я создаю панель с некоторым relais с помощью Raspberry pi zero. Я использую сокет.ввод-вывод для подключения интерфейса с 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
    }
  });
}
});
  

Проблема, с которой я сталкиваюсь, заключается в обновлении браузера. Статус реле сбрасывается. Это потому, что я определяю new Gpio(pinNumber[i], 'out') внутри цикла for. Если я выну его, все будет работать так, как ожидалось. Но как я могу сделать так, чтобы цикл for выполнялся каждый раз, когда он запускает другое реле (малиновый вывод)?

Надеюсь, это имеет смысл. Большое спасибо, приветствую!

Ответ №1:

Из того, что я понял из вашего вопроса, я понял это как:

  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 переменной в приведенном выше примере кода, поскольку не видел для нее применения.

Комментарии:

1. Именно то, что я искал. Спасибо!

2. @skuettel Рад, что это помогло. Не могли бы вы пометить ответ как принятый тогда?