Привет всем. Подскажите, пожалуйста, как правильно и безопасно реализовать выполнение функции через случайные промежутки времени?
Первая функция:
Например, есть функция
actionCalcAndPrint. В ней с помощью
setInterval через каждую секунду выполняю инкремент значения переменной
gCountRepeats и вывод её в консоль. Когда значение достигает
gMAX_COUNT_REPEATS =
20, подсчёт и вывод прекращается, посредством
clearInterval переменной
gTimerIdActionCallAndPrint. Грубо говоря, данная функция выполняет запуск определённых монотонных повторяющихся действий, которые прекращаются через 20 секунд после запуска.
Вторая функция:
И мне необходимо, чтобы вызов этой первой функции происходил постоянно через случайный промежуток времени в диапазоне от
gSTART_TIME_INTERVAL =
60000 до
gEND_TIME_INTERVAL =
120000 (от 1 до 2 минут) после предыдущего вызова (или от начала выполнения программы, если вызовов ещё не было). Попробовал реализовать с помощью рекурсии в функции
runSomeActionInTimeInterval.
Примечание:
Во второй функции
gSTART_TIME_INTERVAL и
gEND_TIME_INTERVAL, на деле будут
гораздо больше в промежутке от
15 до 30 минут (
указал меньше для примера), а в первой функции время подсчёта и вывода останется неизменным в районе 20 секунд.
Хотел бы узнать мнение правильным ли будет такое решение ниже:
const gSTART_TIME_INTERVAL = 60000;
const gEND_TIME_INTERVAL = 120000;
const gTIME_REPEAT_ACTION_CALL_AND_PRINT = 1000;
const gMAX_COUNT_REPEATS = 20;
let gCountRepeats = 0;
let gTimerIdActionCallAndPrint;
function сalсAndPrint() {
if (gCountRepeats < gMAX_COUNT_REPEATS) {
gCountRepeats++;
console.log("Сейчас идёт вызов: " + gCountRepeats);
}
else {
clearInterval(gTimerIdActionCallAndPrint);
console.log("Действие: вызовы и печать завершено");
gCountRepeats = 0;
}
}
function actionCalcAndPrint() {
console.log("Выполнен запуск действия: Вызовы и печать")
gTimerIdActionCallAndPrint = setInterval(сalсAndPrint, gTIME_REPEAT_ACTION_CALL_AND_PRINT)
}
function runSomeActionInTimeInterval(action, startTime, endTime) {
const lTimeInterval = Math.floor(Math.random() * (endTime - startTime + 1)) + startTime;
console.log("...очередное действие будет запущено через " + lTimeInterval / 1000 + " сек.");
setTimeout(function() {
action();
runSomeActionInTimeInterval(action, startTime, endTime);
}, lTimeInterval)
}
runSomeActionInTimeInterval(actionCalcAndPrint, gSTART_TIME_INTERVAL, gEND_TIME_INTERVAL);
Заранее, благодарен.