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

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

Фрагмент кода 1:

setTimeout(() => console.log("Hello, World!"), 1000);

Объяснение.В этом фрагменте кода показано основное использование setTimeout. Функция setTimeout вызывается с двумя аргументами: функцией обратного вызова и задержкой в ​​миллисекундах. В этом случае функция обратного вызова регистрирует «Hello, World!» на консоль после задержки 1000 миллисекунд (1 секунда).

Вывод:

Hello, World!

Фрагмент кода 2:

const greet = () => console.log("Greetings!");
setTimeout(greet, 2000);

Объяснение. Здесь мы определяем функцию greet, которая регистрирует "Привет!" к консоли. Передавая greet в качестве функции обратного вызова в setTimeout с задержкой 2000 миллисекунд (2 секунды), мы гарантируем задержку выполнения функции.

Вывод:

Greetings!

Фрагмент кода 3:

const printMessage = (message) => console.log(message);
setTimeout(printMessage, 3000, "This is a delayed message.");

Объяснение. В этом фрагменте мы определяем функцию printMessage, которая принимает параметр message и записывает его в консоль. Предоставляя дополнительный аргумент setTimeout, мы передаем значение «Это отложенное сообщение». в функцию обратного вызова после задержки в 3000 миллисекунд (3 секунды).

Вывод:

This is a delayed message.

Фрагмент кода 4:

let counter = 0;
setTimeout(() => console.log(counter++), 1000);
setTimeout(() => console.log(counter++), 2000);
setTimeout(() => console.log(counter++), 3000);

Объяснение. Здесь мы инициализируем переменную counter значением 0. Три последовательных вызова setTimeout увеличивают значение counter и записывают его в консоль с разной задержкой: 1000 миллисекунд (1 секунда), 2000 миллисекунд (2 секунды) и 3000 миллисекунд (3 секунды).

Вывод:

0
1
2

Фрагмент кода 5:

const fetchData = (id) => {
  // Simulating an asynchronous data retrieval
  setTimeout(() => console.log(`Data retrieved for ID ${id}`), 1000);
};

for (let i = 1; i <= 5; i++) {
  fetchData(i);
}

Объяснение. В этом примере мы определяем функцию fetchData, которая имитирует операцию асинхронного извлечения данных. Он принимает параметр id и выводит сообщение на консоль с соответствующим параметром id. Внутри цикла for мы вызываем fetchData с идентификаторами от 1 до 5.

Вывод:

Data retrieved for ID 1
Data retrieved for ID 2
Data retrieved for ID 3
Data retrieved for ID 4
Data retrieved for ID 5

Фрагмент кода 6:

const tasks = ["Task 1", "Task 2", "Task 3", "Task 4", "Task 5"];

const processTask = (task) => {
  console.log(`Processing: ${task}`);
};

tasks.forEach((task, index) => {
  setTimeout(() => processTask(task), (index + 1) * 1000);
});

Объяснение. В этом фрагменте у нас есть массив tasks, содержащий разные имена задач. Функция processTask записывает обрабатываемую задачу в консоль. Перебирая массив tasks с помощью forEach, мы планируем выполнение каждой задачи после задержки. Задержка вычисляется динамически на основе индекса задачи, начиная с 1000 миллисекунд (1 секунда) и увеличиваясь на 1000 миллисекунд для каждой последующей задачи.

Вывод:

Processing: Task 1
Processing: Task 2
Processing: Task 3
Processing: Task 4
Processing: Task 5

Фрагмент кода 7:

const delayedSum = (a, b) => {
  setTimeout(() => {
    const result = a + b;
    console.log(`Sum of ${a} and ${b} is ${result}.`);
  }, 2000);
};

delayedSum(5, 10);

Объяснение. В этом фрагменте мы определяем функцию delayedSum, которая принимает два параметра a и b. Внутри функции фактическая сумма вычисляется асинхронно с использованием setTimeout с задержкой 2000 миллисекунд (2 секунды). После задержки сумма выводится на консоль.

Вывод:

Sum of 5 and 10 is 15.

Фрагмент кода 8:

let countdown = 5;

const countDownInterval = setInterval(() => {
  console.log(countdown);
  countdown--;
  if (countdown === 0) {
    clearInterval(countDownInterval);
    console.log("Countdown complete!");
  }
}, 1000);

Объяснение. В этом примере мы создаем таймер обратного отсчета, используя setInterval и setTimeout. Начальное значение countdown установлено равным 5. Функция setInterval неоднократно регистрирует значение countdown и уменьшает его каждую секунду (1000 миллисекунд). Когда countdown достигает 0, интервал очищается, и «Обратный отсчет завершен!» регистрируется в консоли.

Вывод:

5
4
3
2
1
Countdown complete!

Фрагмент кода 9:

const fetchDataWithDelay = (id) => {
  setTimeout(() => console.log(`Data retrieved for ID ${id}`), Math.random() * 3000);
};

for (let i = 1; i <= 5; i++) {
  fetchDataWithDelay(i);
}

Объяснение. В этом фрагменте мы определяем функцию fetchDataWithDelay, которая имитирует операцию асинхронного извлечения данных. Задержка для каждого извлечения данных является случайным значением от 0 до 3000 миллисекунд. Вызывая fetchDataWithDelay в цикле, мы получаем данные для пяти разных идентификаторов со случайными задержками.

Вывод:

Data retrieved for ID 3
Data retrieved for ID 2
Data retrieved for ID 1
Data retrieved for ID 5
Data retrieved for ID 4

Примечание. Порядок вывода может меняться из-за случайных задержек.

Фрагмент кода 10:

const names = ["Alice", "Bob", "Charlie", "Dave", "Eve"];

const greetWithDelay = (name, delay) => {
  setTimeout(() => {
    console.log(`Hello, ${name}!`);
  }, delay);
};

names.forEach((name, index) => {
  greetWithDelay(name, (index + 1) * 1000);
});

Объяснение. Здесь у нас есть массив names, содержащий разные имена. Функция greetWithDelay принимает параметр name и delay в миллисекундах. Он записывает персонализированное приветствие на консоль с указанным именем после указанной задержки. Перебирая массив names с помощью forEach, мы планируем каждое приветствие с динамической задержкой, начиная с 1000 миллисекунд (1 секунда) и увеличивая на 1000 миллисекунд для каждого последующего имени.

Вывод:

Hello, Alice!
Hello, Bob!
Hello, Charlie!
Hello, Dave!
Hello, Eve!

Фрагмент кода 11:

const fetchDataSequentially = async () => {
  const data1 = await fetchDelayedData(1, 2000);
  console.log(`Data retrieved for ID 1: ${data1}`);
  
  const data2 = await fetchDelayedData(2, 1500);
  console.log(`Data retrieved for ID 2: ${data2}`);
  
  const data3 = await fetchDelayedData(3, 3000);
  console.log(`Data retrieved for ID 3: ${data3}`);
};

const fetchDelayedData = (id, delay) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(`Data for ID ${id}`);
    }, delay);
  });
};

fetchDataSequentially();

Объяснение.В этом фрагменте мы моделируем получение данных последовательно, используя setTimeout и async/await. Функция fetchDelayedData возвращает обещание, которое разрешается с данными для определенного идентификатора после указанной задержки. Функция fetchDataSequentially использует await для последовательного получения данных для трех разных идентификаторов с различными задержками. Как только данные получены, они записываются в консоль.

Вывод:

Data retrieved for ID 1: Data for ID 1
Data retrieved for ID 2: Data for ID 2
Data retrieved for ID 3: Data for ID 3

Фрагмент кода 12:

const fetchDataParallel = async () => {
  const promises = [];

  for (let i = 1; i <= 5; i++) {
    const promise = fetchDelayedData(i, Math.random() * 2000);
    promises.push(promise);
  }

  const results = await Promise.all(promises);
  results.forEach((data, index) => {
    console.log(`Data retrieved for ID ${index + 1}: ${data}`);
  });
};

fetchDataParallel();

Объяснение. В этом фрагменте кода мы имитируем получение данных параллельно, используя setTimeout, async/await и Promise.all(). Функция fetchDelayedData возвращает обещание, которое разрешается с данными для определенного идентификатора после случайно сгенерированной задержки. Внутри функции fetchDataParallel промисы создаются для каждой операции извлечения данных и сохраняются в массиве. Используя Promise.all(), мы ждем разрешения всех промисов и получения данных. Наконец, мы записываем полученные данные для каждого идентификатора в консоль.

Вывод:

Data retrieved for ID 1: Data for ID 1
Data retrieved for ID 2: Data for ID 2
Data retrieved for ID 3: Data for ID 3
Data retrieved for ID 4: Data for ID 4
Data retrieved for ID 5: Data for ID 5

Примечание. Порядок вывода может отличаться из-за случайных задержек.

Фрагмент кода 13:

const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

const fetchDataWithRetry = async (id, retries = 3) => {
  try {
    const data = await fetchData(id);
    console.log(`Data retrieved for ID ${id}: ${data}`);
  } catch (error) {
    console.log(`Failed to retrieve data for ID ${id}. Retries left: ${retries}`);
    if (retries > 0) {
      await delay(1000);
      await fetchDataWithRetry(id, retries - 1);
    } else {
      console.log(`Max retries exceeded for ID ${id}.`);
    }
  }
};

const fetchData = (id) => {
  return new Promise((resolve, reject) => {
    // Simulating an asynchronous data retrieval
    setTimeout(() => {
      if (Math.random() < 0.5) {
        resolve(`Data for ID ${id}`);
      } else {
        reject(new Error(`Failed to retrieve data for ID ${id}`));
      }
    }, Math.random() * 2000);
  });
};

fetchDataWithRetry(1);

Объяснение. В этом фрагменте показано, как получить данные с повторными попытками, используя setTimeout, async/await и обещания. Функция fetchDataWithRetry пытается получить данные для определенного идентификатора. Если во время извлечения возникает ошибка, он отображает количество оставшихся попыток и рекурсивно вызывает сам себя после 1-секундной задержки. Функция fetchData имитирует процесс асинхронного извлечения данных, случайным образом разрешая или отклоняя промис.

Вывод:

Failed to retrieve data for ID 1. Retries left: 3
Failed to retrieve data for ID 1. Retries left: 2
Data retrieved for ID 1: Data for ID 1

Примечание. Порядок вывода может меняться из-за случайных задержек.

Фрагмент кода 14:

const printNumber = (number) => console.log(number);

const numbers = [1, 2, 3, 4, 5];

numbers.forEach((number, index) => {
  setTimeout(printNumber, index * 1000, number);
});

Объяснение. В этом фрагменте определен массив чисел. Функция printNumber записывает указанный номер в консоль. Используя forEach и setTimeout, мы планируем печать каждого числа с задержкой, основанной на его индексе, начиная с 0 секунд и увеличивая на 1000 миллисекунд для каждого последующего числа.

Вывод:

1
2
3
4
5

Фрагмент кода 15:

const showNotification = () => {
  const notification = document.createElement("div");
  notification.textContent = "This is a notification!";
  document.body.appendChild(notification);
  
  setTimeout(() => {
    document.body.removeChild(notification);
  }, 3000);
};

showNotification();

Объяснение. В этом фрагменте показано, как создать и удалить элемент уведомления с помощью setTimeout. Функция showNotification создает новый элемент div, задает для его текстового содержимого значение «Это уведомление!», добавляет его к элементу body и планирует его удаление через 3000 миллисекунд (3 секунды) с задержкой, используя setTimeout.

Вывод: уведомление появляется на веб-странице в течение 3 секунд, а затем исчезает.

Краткое содержание:

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

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

Надеюсь, что приведенная выше статья дала лучшее понимание. Если у вас есть какие-либо вопросы относительно областей, которые я обсуждал в этой статье, области улучшения, не стесняйтесь комментировать ниже.

[Раскрытие информации: эта статья является совместным творением, в котором мои собственные идеи сочетаются с помощью ChatGPT для оптимальной артикуляции.]