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 в рамките на цикъл, ние извличаме данни за пет различни ID с произволни закъснения.

Изход:

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 за оптимална артикулация.]