所以我正在尝试构建一个Web应用程序,它将每隔30秒ping一次设备的寄存器以存储数据。
如您所见,每个设备可以有多个寄存器。当用户创建一个新设备时,我会迭代我从ajax post(生成的DB id)返回的所有新创建的寄存器ID,然后启动一个间隔计时器,每30秒调用一次ajax调用一个方法来ping我的设备并得到特定寄存器的数据。
我遇到的问题是,每次间隔运行我的ajax调用时,它都会重复使用最后一个寄存器ID来获取数据,而不是在每个寄存器上运行fetch。防爆。我的2行的ID为22
和23
。每次调用我的间隔函数时,它将使用标识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..');
}
});
}
答案 0 :(得分:1)
这是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;
}
的相同值。要修复它,请创建一个新范围:
Size newSize = new Size((int)(originalBitmap.Width * zoomFactor),
(int)(originalBitmap.Height * zoomFactor));
Bitmap bmp = new Bitmap(originalBitmap, newSize);