Несколько тайм-аутов JavaScript - проблема с извлечением данных в реальном времени - PullRequest
2 голосов
/ 18 июля 2011

Я строю систему реального времени, которая (с использованием веб-сокетов) обновляет таблицу живыми данными с разными частотами (может быть 3 раза в секунду, может быть один раз каждые 2 секунды - в зависимости от типа данных),В настоящее время я пытаюсь найти способ сообщить пользователю, когда конкретное поле не обновлялось в течение последних 5 секунд.То есть, если новые данные не извлекаются, мне не следует сохранять старое значение там, а вместо этого менять его на «-» или что-то подобное.

После долгого пути к javascript последняя функция, которая обновляет поля, выглядит так (очень упрощенно):

function changeValue(data){
        var fieldId= data.fieldId;
        var value = Math.round(data.value);
        $('span#'+fieldId).text(value);
}

Эта функция вызывается каждый раз, когда необходимо изменить поле.У меня есть от 2 до 40 различных полей (в зависимости от пользователя), которые изменены.

Каков наилучший способ установки таймеров для изменения значений полей на '-' каждые 5 секунд, если обновление не было сделано?

Буду очень признателенЗа несколько советов, спасибо, Кароль.

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Поскольку вы хотите указать время ожидания для каждого поля, у вас есть два очевидных варианта:

  1. Есть глобальный интервальный таймер, который довольно часто переключается и просматривает все ваши поля для поискаtimeout.
  2. Имеют независимые таймеры для каждого поля, которые имеют дело только с этим полем.

Я думаю, что в целом я предпочитаю (1) - (2), потому что мы имеем дело только сзатем с одним интервальным таймером, что упрощает ведение домашнего хозяйства.

Поскольку идентификаторы в документах должны быть уникальными, мы можем использовать значения идентификаторов вашего поля в качестве ключа в хэше (объекте) для хранения последних обновленных времен.Это своего рода ответ на предыдущий ответ, но работает на основе поля.Итак, вот как мы устанавливаем эти последние обновленные времена:

var lastUpdatedTimes = {};

function changeValue(data){
        var fieldId= data.fieldId;
        var value = Math.round(data.value);
        $('span#'+fieldId).text(value);
        lastUpdatedTimes[fieldId] = new Date().getTime();
}

Затем вы устанавливаете интервальный таймер для проверки каждого из них.

function checkFieldsForTimeout(){
        var now = new Date.getTime();

        // For each ID in lastUpdatedTimes, see if 'now minus
        // last updated' is > 5000 and is so, set the field
        // text to '--' and remove that entry from the last
        // updated list with "delete lastUpdatedTimes[itemId]".
}

Если пружина поля тайм-аутак жизни «-» снова будет заменен каким-то реальным текстом.

Удаляя последнее обновленное время из «lastUpdatedTimes» всякий раз, когда мы помещаем «-» в поле, мы гарантируем, чтотаймер интервала не тратит время на обработку полей, которые уже истекли.

1 голос
/ 18 июля 2011

Этот ответ был расширен для обработки нескольких полей после комментария @Andrew (см. Также его ответ).

Введите свойство updatedTime, которое содержит последний раз, когдаданные были обновлены, в каждой информации.Периодический таймер проверяет updatedTime для всех данных и обновляет текстовое поле, если это необходимо.Проверка должна быть в два раза чаще , чем период обнаружения.Ваша функция changeValue() обновляет updatedTime и текстовое поле.

function checkData() {
    var now = new Date.getTime();
    for "each data" {
        if (now - data.updatedTime >= 5000) {
            var fieldId = data.fieldId;                      
            $('span#'+fieldId).text('--');
        }            
    }
}
function changeValue(data) {              
     var fieldId = data.fieldId;              
     var value = Math.round(data.value);              
     $('span#'+fieldId).text(value);
     data.updatedTime = new Date.getTime();      
}
// Install periodic timer to check last updates:
setInterval(checkData, 5000 / 2);   // interval = half the required detection period  
...