2015-12-03 2 views
0

Итак, я пытаюсь создать веб-приложение, которое будет пинговать регистры устройства для хранения данных каждые 30 секунд.Обработка нескольких setinterval javascript

enter image description here

как вы можете видеть каждое устройство может иметь несколько регистров. Когда пользователь создает новое устройство, я повторяю все вновь созданный идентификатор регистра, который я возвращаю из своего сообщения ajax (сгенерированный идентификатор БД), а затем запускаю таймер интервала, создавая ajax-вызов каждые 30 секунд для метода, который будет пинговать мое устройство и получать данные для конкретного регистра.

Проблема, с которой я столкнулся, заключается в том, что каждый раз, когда интервал запускает мой вызов ajax, он повторно использует последний идентификатор регистра для извлечения данных вместо запуска выборки в каждом отдельном регистре. Ex. мои 2 строки имеют идентификатор 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; 
     } 

Вот мой Аякса вызов прочитать указанный регистр:

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

Это очень распространенная ошибка в 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; 
    } 
+0

ah thank you sir. Я понятия не имел об этом. Есть ли больше информации об этом в любом месте? – john

+0

Обман, который я связал, объясняет эту концепцию. –

Смежные вопросы