Остановка функции JS

153
26 ноября 2017, 14:17

Есть пользователи, получаемые из базы данных. Каждому пользователю можно сбросить пароль. При этом пароль можно сбрасывать не чаще, чем раз в три минуты. Если пароль был сброшен менее трех минут назад, при помощи JS на странице отрисовывается таймер, показывающий сколько времени осталось до возможности следующего сброса. По окончанию отсчета, кнопка сброса пароля становится доступной и выводится соответствующая надпись. так как таймер у каждого пользователя свой, то при выборе другого пользователя текущий таймер сбрасывается вызовом функции reset и стартует новый. Так как это фронт, работать должен только таймер выбранного пользователя. Если пользователь меняется, таймер убивается и создается новый на основании данных с бэка.

Таймер:

var timerCount = 0;

function startTimer(minute, second) {
    timerCount++;
    start(minute, second);
}
function start(minute, second) {
    disableButton('resetPasswordButton');
    var m = minute;
    var s = second;
    if (timerCount == 0) {
        document.getElementById('expiredTimeOutputText').innerHTML = "Кнопка доступна!";
        m = 0;
        s = 0;
        enableButton('resetPasswordButton');
        return ;
    }
    if (s == 0) {
        if (m == 0) {
            reset();
            document.getElementById('expiredTimeOutputText').innerHTML = "Кнопка доступна!";
            enableButton('resetPasswordButton');
            return ;
        }
        m--;
        s = 59;
    } else
        s--;
    document.getElementById('expiredTimeOutputText').innerHTML = m + ":" + s;
    setTimeout(function () {
        start(m, s);
    }, 1000);
}

function reset() {
    if (timerCount > 0) {
        timerCount = 0;
    }
}

function enableButton(id){
    document.getElementById(id).disabled = false;
}
function disableButton(id){
    document.getElementById(id).disabled = true;
}

Метод запуска таймера по клику по кнопке:

public void changePassword() {
    RequestContext requestContext = RequestContext.getCurrentInstance();
    requestContext.execute("startTimer(\"0\", \"40\")");
    Date tmpDate = new Date();
    Long diff = tmpDate.getTime();
    mainDataBean.setResetTimer(applicantsTableSelectedRow.get("Идентификатор"), diff.toString());
}

Метод запуска таймера при выборе другого пользователя:

public void checkTimerForNewUser() {
    RequestContext requestContext = RequestContext.getCurrentInstance();
    Date tmpDate = new Date();
    Long currentTime = tmpDate.getTime();
    requestContext.execute("reset()");
    if (applicantsTableSelectedRow != null) {
        if (!mainDataBean.getResetTimer(applicantsTableSelectedRow.get("Идентификатор")).equals("noTimer")) {
            Long applicantTimerTime = Long.parseLong(mainDataBean.getResetTimer(applicantsTableSelectedRow.get("Идентификатор")));
            if (currentTime - applicantTimerTime > timerValue) {
                mainDataBean.deleteResetTimer(applicantsTableSelectedRow.get("Идентификатор"));
            }
            else {
                expiredTimeMinute = (timerValue - (currentTime - applicantTimerTime)) / 60000;
                expiredTimeSecond = (timerValue - (currentTime - applicantTimerTime)) / 1000 - expiredTimeMinute * 60;
                requestContext.execute("startTimer(\"" + expiredTimeMinute + "\", \"" + expiredTimeSecond + "\")");
            }
        }
    }
}

Если последовательно идти по пользователям и сбрасывать у каждого пароли - все ок. Но если последовательно пройтись по 5 пользователям, сбросить каждому пароль и потом вернуться к первому пользователю со сброшенным паролем, если время не истекло - отображаются все 5 таймеров, перекрывая друг друга 5 раз в секунду. Хотя по идее они должны были остановиться, поскольку при выборе нового пользователя вызывается функция reset. Как сделать чтобы функция starTimer выполнялась в единственном экземпляре? Я неправильно останавливаю функции?

READ ALSO
Spring Boot CRUD - постраничный вывод

Spring Boot CRUD - постраничный вывод

Изучаю Spring Boot, по мануалам сделал приложение, которое выводит список людей с удалением, добавление, редактированием, все работаетТеперь пытаюсь...

136
Есть ли в Java 8 реализации паттерна монада?

Есть ли в Java 8 реализации паттерна монада?

Есть ли в стандартной библиотеке Java 8 реализации паттерна монада?

174
ng-selected Выборка из массива

ng-selected Выборка из массива

Помогите использовать функцию выборки объекта из массива для создания нового массива

283