javascript setInterval удваивает console.logs

#javascript

#javascript

Вопрос:

Я использую самозапускающуюся функцию в скрипте, который я вызвал из расширения Chrome, которое я создаю.

У меня просто setInval каждые 30 секунд. Моя проблема, если удваивается console.log каждые 30 секунд, а не только один журнал.

Поэтому, когда страницы загружаются, они печатаются один раз. Затем через 30 секунд вместо печати еще одного он печатает 2 журнала. Затем 4, 8, 16 раз и т.д.

Очень странно.

 (function check() { 
    console.log("Exists!"); 
    return setInterval(check, 30000); 
})();
 

Ответ №1:

setInterval устанавливает интервал — он будет вызывать обратный вызов каждый интервал. Если вы вызываете setInterval дважды, периодически будут выполняться 2 обратных вызова. Если у вас есть setInterval , который рекурсивно вызывает себя, вы в конечном итоге получите 4, затем 8, затем 16 и т. Д. интервалы.

Либо удалите рекурсивный вызов:

 setInterval(() => {
    console.log("Exists!"); 
}, 30000);
 

Или используйте setTimeout вместо:

 (function check() { 
    console.log("Exists!"); 
    return setTimeout(check, 30000); 
})();
 

Ответ №2:

Потому что вы устанавливаете интервал внутри функции, чтобы она регистрировалась один раз, но также будет повторно регистрировать значения каждый раз. Интервалы сохраняются, поэтому интервалы суммируются.