Очистите таймер в другом API, заданный setInterval(), созданным в одном API

#node.js #express #setinterval #clearinterval

#node.js #выразить #setinterval #очистить интервал

Вопрос:

Очистите таймер в другом API, установленном setInterval() созданным в одном API. У меня есть api, который запускается setInterval() , и я сохраняю его идентификатор таймера в базе данных. Когда вызывается другой API, я хочу очистить старый таймер, используя идентификатор таймера старого таймера из базы данных. Я знаю, clearInterval() справится с этой работой.

clearInterval() выполнит задание, но после сохранения его в базе данных (JSON.stringify(intervalId)) и извлечения (JSON.parse(intervalId)) с помощью таймера отключения он не работает. Могу ли я получить доступ к timer после выхода из функции? Даже если я сохраню его в базе данных (timer-id). Я делаю что-то не так?

 var intervalID = setInterval(function() {
console.log(intervalID);
/// Updating in DB
Model.updateById(Id, {timer_data: JSON.stringify(intervalID)});
}, 30000);
}
  

// Теперь извлекаем и отключаем его

 Model.findById(id).then(data=> {

var intervalID = JSON.parse(data.timer_data);
clearInterval(intervalID);

}
  

Я ожидал, что старый таймер будет убит, но он все еще живет и выполняется. Это удаляет все мои задания, мне нужно, чтобы он был убит, когда потребуется.

Ответ №1:

В отличие от браузеров, node.js реализация clearInterval() не возвращает числовой идентификатор. Он возвращает Timeout объект. И поскольку объект содержит символы, вы не сможете сохранить его в базе данных.

В качестве обходного пути я предлагаю сохранить Timeout объект в самой памяти.

Вот фрагмент кода, который поможет вам:

 // Declaring the object
const inMemoryTimers = {};

/** Setting the timer */
// While saving the timer, saving the timer as inMemoryTimers[Id]
const timer = setInterval(() => {
    inMemoryTimers[Id] = timer;
}, 1000);

/** Clearing the timer */
// Retrieve the timer from inMemoryTimers
const timer = inMemoryTimers[Id];
clearInterval(timer);
  

Комментарии:

1. это не работает для двух разных API. Один API инициализирует таймер, другой пытается его отключить. Поэтому, когда вызывается второй API, «const inMemoryTimers = {};» снова устанавливается в пустой массив, следовательно, уничтожение старого таймера не работает. Можете ли вы предложить какой-либо метод сохранения в памяти, который доступен на уровне проекта. Спасибо.

2. Находятся ли эти два API в одном файле?

3. это вспомогательный метод, и да, оба API находятся в одном файле. Я даже пытался сохранить данные таймера в кеш. Даже он также не работает, извините за поздний ответ.

4. Тогда вы можете просто определить const inMemoryTimers = {} в контексте файла, а не внутри вспомогательной функции. Таким образом, объект будет общим и не будет перезаписан

Ответ №2:

допустим, у нас есть 2 API FirstAPI- имеют setinterval для повторения некоторого кода SecondAPI- для очистки Inter val для остановки повторяющегося кода

FirstAPI:

 let intervalId = setIterval{
  if database have value == false ? continue code
  else clearInterval(intervalId)
}
  

SecondAPI:
установить значение базы данных в false

Идея в целом :

для clearInterval inside setInterval ,,, с флагом true amp; false в базе данных