处理多个setinterval javascript

时间:2015-12-03 19:43:42

标签: javascript jquery python ajax setinterval

所以我正在尝试构建一个Web应用程序,它将每隔30秒ping一次设备的寄存器以存储数据。

enter image description here

如您所见,每个设备可以有多个寄存器。当用户创建一个新设备时,我会迭代我从ajax post(生成的DB id)返回的所有新创建的寄存器ID,然后启动一个间隔计时器,每30秒调用一次ajax调用一个方法来ping我的设备并得到特定寄存器的数据。

我遇到的问题是,每次间隔运行我的ajax调用时,它都会重复使用最后一个寄存器ID来获取数据,而不是在每个寄存器上运行fetch。防爆。我的2行的ID为2223。每次调用我的间隔函数时,它将使用标识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..');
        }
    });
}

1 个答案:

答案 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);