处理多个 setinterval javascript
Handling multiple setinterval javascript
所以我正在尝试构建一个 Web 应用程序,该应用程序将每 30 秒 ping 一次设备寄存器以获取存储的数据。
如您所见,每个设备可以有多个寄存器。当用户创建新设备时,我从我的 ajax post(生成的 DB id)中迭代我 return 的所有新创建的寄存器 ID,然后启动一个间隔计时器使 ajax 每 30 秒调用一个方法,该方法将 ping 我的设备并获取特定寄存器的数据。
我 运行 遇到的问题是,每次间隔运行我的 ajax 调用时,它都会重新使用最后一个寄存器 ID 来获取数据,而不是 运行每个人注册。前任。我的 2 行的 ID 为 22
和 23
。每次调用我的间隔函数时,它都会使用 id 23
并进行 ajax 调用,而不是调用 22
然后 23
。这是因为我在实例化新间隔时使用了 for loop
吗?
以下是我尝试处理 setInterval
:
的方式
var registers = result.register_ids;
for (var i = 0; i < registers.length; ++i) {
debugger;
var interval = setInterval(function () { fetchRegisterValues(registers[i], result.modbus_id) }, 30000);
register_ping_threads[registers[i]] = interval;
}
这是我的 ajax 读取指定寄存器的调用:
function fetchRegisterValues(register_id, modbus_id) {//id always ends up being 23
debugger;
$.ajax({
type: "POST",
url: "/fetch_mdata",
data: {
'csrfmiddlewaretoken': token,
'register_id': register_id, //use to read the register range
'modbus_id': modbus_id //used to get device connectiong settings
},
contentType: "application/x-www-form-urlencoded",
dataType: 'json',
success: function (result) {
debugger;
$('[data-register="' + register_id + '"]').find('[data-value=""]').text(result.value);
},
error: function (data) {
debugger;
$('#loading-icon').hide()
$('#ping_error').addClass('alert alert-danger');
$('#ping_error strong').append('Problem contacting server..');
}
});
}
这是JavaScript中很常见的错误。请记住,i
是在函数范围内,而不是循环范围内,因此您所有的 fetchRegisterValues
将重用 i
的相同值。要修复它,请创建一个新范围:
for (var i = 0; i < registers.length; ++i) {
debugger;
var interval = setInterval((function (i) { return function() { fetchRegisterValues(registers[i], result.modbus_id) } })(i), 30000);
register_ping_threads[registers[i]] = interval;
}
所以我正在尝试构建一个 Web 应用程序,该应用程序将每 30 秒 ping 一次设备寄存器以获取存储的数据。
如您所见,每个设备可以有多个寄存器。当用户创建新设备时,我从我的 ajax post(生成的 DB id)中迭代我 return 的所有新创建的寄存器 ID,然后启动一个间隔计时器使 ajax 每 30 秒调用一个方法,该方法将 ping 我的设备并获取特定寄存器的数据。
我 运行 遇到的问题是,每次间隔运行我的 ajax 调用时,它都会重新使用最后一个寄存器 ID 来获取数据,而不是 运行每个人注册。前任。我的 2 行的 ID 为 22
和 23
。每次调用我的间隔函数时,它都会使用 id 23
并进行 ajax 调用,而不是调用 22
然后 23
。这是因为我在实例化新间隔时使用了 for loop
吗?
以下是我尝试处理 setInterval
:
var registers = result.register_ids;
for (var i = 0; i < registers.length; ++i) {
debugger;
var interval = setInterval(function () { fetchRegisterValues(registers[i], result.modbus_id) }, 30000);
register_ping_threads[registers[i]] = interval;
}
这是我的 ajax 读取指定寄存器的调用:
function fetchRegisterValues(register_id, modbus_id) {//id always ends up being 23
debugger;
$.ajax({
type: "POST",
url: "/fetch_mdata",
data: {
'csrfmiddlewaretoken': token,
'register_id': register_id, //use to read the register range
'modbus_id': modbus_id //used to get device connectiong settings
},
contentType: "application/x-www-form-urlencoded",
dataType: 'json',
success: function (result) {
debugger;
$('[data-register="' + register_id + '"]').find('[data-value=""]').text(result.value);
},
error: function (data) {
debugger;
$('#loading-icon').hide()
$('#ping_error').addClass('alert alert-danger');
$('#ping_error strong').append('Problem contacting server..');
}
});
}
这是JavaScript中很常见的错误。请记住,i
是在函数范围内,而不是循环范围内,因此您所有的 fetchRegisterValues
将重用 i
的相同值。要修复它,请创建一个新范围:
for (var i = 0; i < registers.length; ++i) {
debugger;
var interval = setInterval((function (i) { return function() { fetchRegisterValues(registers[i], result.modbus_id) } })(i), 30000);
register_ping_threads[registers[i]] = interval;
}