Задать вопрос
@trickBu
бывший будущий кодер

Как правильно и безопасно реализовать выполнение функции через случайные промежутки времени?

Привет всем. Подскажите, пожалуйста, как правильно и безопасно реализовать выполнение функции через случайные промежутки времени?

Первая функция:
Например, есть функция 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);


Заранее, благодарен.
  • Вопрос задан
  • 140 просмотров
Подписаться 1 Простой 7 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы