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)?
希望这是有道理的。非常感谢,干杯!
根据我从您的问题中收集到的信息,我将其理解为:
- 您希望 GPIO 引脚的初始化发生在循环之外,这样它就不会在每次建立新连接时都被重置。
- 您希望在初始化移出循环后仍然能够寻址正确的引脚。
那么我的建议是:
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
变量,因为我没有看到它的用途。
我的第一个 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)?
希望这是有道理的。非常感谢,干杯!
根据我从您的问题中收集到的信息,我将其理解为:
- 您希望 GPIO 引脚的初始化发生在循环之外,这样它就不会在每次建立新连接时都被重置。
- 您希望在初始化移出循环后仍然能够寻址正确的引脚。
那么我的建议是:
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
变量,因为我没有看到它的用途。