#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 в базе данных