Как определить состояние setInterval?

485
29 августа 2017, 14:01

Привет. Допустим, есть код:

let interval = setInterval(() => doSomething(), 3000);

Чтобы остановить исполнение setInterval, нужно сделать clearInterval(interval);

Вопрос: а как, собственно, определить, работает ли ещё setInterval, или он уже прекратил свою работу?

console.log(interval) что во время работы, что уже после clearInterval показывает одно и то же число - 69. После перезагрузки страницы оно может измениться.

Answer 1
let interval = setInterval(() => doSomething(), 3000);
// interval - принимает id интервала (генерируется случайно, любое целое число > 0)

На сколько мне известно, отслеживать можно только одним способом:

let intervalID = setInterval(function(){}, 1000); 
 
setTimeout(function() { 
  clearTimeout(intervalID); // Отменяем 
  intervalID = null; // Следом задаем id значение false/null/undefined/0 (кому как нравится) 
}, 3000); 
 
// Просто для вывода состояния 
const statusIntervalID = setInterval(function() { 
  if(intervalID) { // Проверяем активен ли интервал 
    console.log('Interval is active'); 
  } else { 
    clearInterval(statusIntervalID); 
    console.log('Interval cleared'); 
  } 
}, 500);

Answer 2

Нет прямого способа сделать то, что вы ищете. Вместо этого вы можете установить timer false при каждом вызове clearInterval:

// Start timer
var timer = setInterval(fncName, 1000);
// End timer
clearInterval(timer);
timer = false;

Теперь timer либо будет ложным , либо будет иметь значение в данный момент времени, поэтому вы можете просто проверить

if (timer)
    ...

Если вы хотите инкапсулировать это в класс:

function Interval(fn, time) {
    var timer = false;
    this.start = function () {
        if (!this.isRunning())
            timer = setInterval(fn, time);
    };
    this.stop = function () {
        clearInterval(timer);
        timer = false;
    };
    this.isRunning = function () {
        return timer !== false;
    };
}
var i = new Interval(fncName, 1000);
i.start();
if (i.isRunning())
    // ...
i.stop();

Источник: https://stackoverflow.com/questions/2679141

READ ALSO
Получить обновления с канала на YouTube

Получить обновления с канала на YouTube

Нужен аналог webHook в Telegram (ну, или хотя бы long-poll), который мониторит видео на канале YouTube и при добавлении нового видео передает информацию о нем...

372
Как сделать поле названия js [требует правки]

Как сделать поле названия js [требует правки]

как сделать поле для названия, при вводе на который меняется и title страницы и еще одно поле

294