Очистить таймер в другом API, заданном setInterval (), созданным в одном API - PullRequest
0 голосов
/ 08 апреля 2019

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

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

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 Ответ

0 голосов
/ 08 апреля 2019

В отличие от браузеров, 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);
...