Перейти к содержимому

Таймеры setTimeout и setInterval в JavaScript

В JavaScript функции таймера необходимы для создания динамичных и интерактивных веб-приложений. setTimeout() и setInterval() играют ключевую роль в управлении временем выполнения кода. Это руководство подробно рассматривает эти функции, предоставляя практические советы и примеры кода для их эффективного использования.

Введение в функции таймера JavaScript

JavaScript, необходимый для веб-разработки, обладает функциями таймера, которые запускают код в заданные моменты времени. Среди них setTimeout и setInterval особенно полезны для планирования задач.

Функция setTimeout()

Функция setTimeout() позволяет выполнить фрагмент кода один раз после указанной задержки. Она принимает два параметра: функцию для выполнения и задержку в миллисекундах перед выполнением.

Синтаксис:


javascript
setTimeout(function, delay);

Пример:


Output appears here after Run.

Функция setInterval()

Напротив, setInterval() выполняет функцию повторно через заданный интервал времени. Как и setTimeout(), она принимает функцию и задержку в миллисекундах. Обратите внимание, что если выполнение обратного вызова занимает больше времени, чем заданный интервал, вызовы могут накладываться друг на друга или смещаться. Для точного тайминга вместо этого рекомендуется использовать рекурсивный setTimeout().

Синтаксис:


javascript
setInterval(function, interval);

Пример:


Output appears here after Run.

Отмена запланированного выполнения

JavaScript также предоставляет методы для отмены выполнения, запланированного с помощью setTimeout() и setInterval(), а именно clearTimeout() и clearInterval() соответственно.

Остановка setTimeout():

Чтобы отменить таймаут, сохраните идентификатор, возвращаемый setTimeout(), и передайте его в clearTimeout().

Пример:


Output appears here after Run.

Остановка setInterval():

Аналогично, чтобы остановить интервал, сохраните идентификатор из setInterval() и используйте его с clearInterval().

Пример:


Output appears here after Run.

Практическое применение и советы

Понимание и использование setTimeout() и setInterval() выходит за рамки базового синтаксиса. Вот несколько продвинутых советов и практик для эффективного применения:

  • Дебаунсинг с помощью setTimeout(): Дебаунсинг — это техника ограничения частоты выполнения функции. Она особенно полезна в сценариях, таких как поля поиска, где нежелательно отправлять запрос к API при каждом нажатии клавиши.

html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Debounced Input Example</title>
<script>
    // Debounce function to limit the rate at which a function is executed
    function debounce(func, wait) {
        let timeout;

        return function executedFunction(...args) {
            const later = () => {
                clearTimeout(timeout);
                func(...args);
            };

            clearTimeout(timeout);
            timeout = setTimeout(later, wait);
        };
    }

    // Function to be debounced
    function fetchData(input) {
        alert(`API call with input: ${input}`); // Placeholder for an API call
    }

    // Create a debounced version of fetchData
    const debouncedFetchData = debounce(fetchData, 300);

    // Add the debounced function to an event listener
    function setup() {
        document.getElementById('searchInput').addEventListener('input', (event) => {
            debouncedFetchData(event.target.value);
        });
    }

    // Ensure setup is called once the document is fully loaded
    document.addEventListener('DOMContentLoaded', setup);
</script>
</head>
<body>
    <h3>Type in the input field:</h3>
    <input type="text" id="searchInput" placeholder="Start typing..." />
</body>
</html>

Result

  • Троттлинг с помощью setTimeout(): Троттлинг гарантирует, что функция выполняется не чаще одного раза за заданное количество миллисекунд. Это может быть полезно для обработки событий прокрутки без перегрузки цикла событий браузера. Обратите внимание, что приведенный ниже пример использует подход с выполнением в начале (выполняется немедленно при первом вызове), что может подходить не для всех сценариев по сравнению с альтернативами с выполнением в конце.

html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Throttled Scroll Event</title>
<style>
  /* Simple styling for demonstration */
  body, html {
    height: 200%; /* Make the page scrollable */
    margin: 0;
    padding: 0;
    font-family: Arial, sans-serif;
  }
  #log {
    position: fixed;
    top: 0;
    left: 0;
    background: white;
    border: 1px solid #ccc;
    padding: 10px;
    width: 300px;
  }
</style>
</head>
<body>
<div id="log">Scroll to see the effect...</div>
<script>
// Throttle function using setTimeout
function throttle(func, limit) {
  let lastFunc;
  let lastRan;
  return function() {
    const context = this;
    const args = arguments;
    if (!lastRan) {
      func.apply(context, args);
      lastRan = Date.now();
    } else {
      clearTimeout(lastFunc);
      lastFunc = setTimeout(function() {
        if ((Date.now() - lastRan) >= limit) {
          func.apply(context, args);
          lastRan = Date.now();
        }
      }, Math.max(0, limit - (Date.now() - lastRan)));
    }
  }
}

// Function to be throttled
function handleScroll() {
  const log = document.getElementById('log');
  log.textContent = `Scroll event triggered at: ${new Date().toLocaleTimeString()}`;
}

// Add event listener for scroll
window.addEventListener('scroll', throttle(handleScroll, 1000));
</script>
</body>
</html>

Result

  • Задержки цикла событий: Обратите внимание, что задержки в setTimeout() и setInterval() являются минимальными. Фактическое выполнение может быть отложено, если цикл событий JavaScript занят или если браузер ограничивает работу вкладок в фоновом режиме.
  • Лимиты максимальной задержки: Спецификация JavaScript ограничивает задержки, превышающие 2147483647 (2^31 - 1) миллисекунд, значением 1. Задержки за пределами этого диапазона не будут ждать дольше; они выполнятся почти мгновенно.
  • Использование в веб-приложениях: Эти функции таймера могут улучшить пользовательский опыт за счет добавления анимаций, обработки действий, привязанных ко времени (например, автосохранения полей формы), а также более эффективного управления асинхронными операциями.

Заключение

Освоение setTimeout() и setInterval() критически важно для любого разработчика JavaScript. Эти функции необходимы для планирования задач, помогая сделать веб-приложения динамичными и отзывчивыми. Применяя практики и примеры из этого руководства, разработчики могут эффективно управлять задачами, зависящими от времени, что улучшает как производительность приложения, так и пользовательский опыт.

Практика

Какие из следующих утверждений верны относительно использования `setTimeout()` и `setInterval()` в JavaScript?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.