Есть пользователи, получаемые из базы данных. Каждому пользователю можно сбросить пароль. При этом пароль можно сбрасывать не чаще, чем раз в три минуты. Если пароль был сброшен менее трех минут назад, при помощи 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 выполнялась в единственном экземпляре? Я неправильно останавливаю функции?
Как меняется крипторынок и к чему готовиться владельцам криптообменников
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Изучаю Spring Boot, по мануалам сделал приложение, которое выводит список людей с удалением, добавление, редактированием, все работаетТеперь пытаюсь...
Есть ли в стандартной библиотеке Java 8 реализации паттерна монада?
Помогите использовать функцию выборки объекта из массива для создания нового массива