处理多个 setinterval javascript

Handling multiple setinterval javascript

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

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

我 运行 遇到的问题是,每次间隔运行我的 ajax 调用时,它都会重新使用最后一个寄存器 ID 来获取数据,而不是 运行每个人注册。前任。我的 2 行的 ID 为 2223。每次调用我的间隔函数时,它都会使用 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;
    }