← Назад к вопросам

Приведи пример применения цикла while с первым блоком do

2.0 Middle🔥 192 комментариев
#Архитектура и паттерны

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Do-while цикл: примеры применения

Do-while — это цикл, который сначала выполняет блок кода, а потом проверяет условие. Это означает, что код гарантированно выполнится минимум один раз, даже если условие ложное.

Синтаксис

do {
  // Код выполняется ВСЕГДА, минимум один раз
} while (условие);

В отличие от обычного while, который сначала проверяет условие:

while (условие) {
  // Может не выполниться вообще
}

Практический пример 1: Валидация пользовательского ввода

Одна из самых частых задач — попросить пользователя ввести корректное число:

function getValidAge() {
  let age;
  
  do {
    age = parseInt(prompt('Введи свой возраст (от 1 до 120):'));
    
    if (isNaN(age) || age < 1 || age > 120) {
      console.log('Некорректный возраст. Попробуй снова.');
    }
  } while (isNaN(age) || age < 1 || age > 120);
  
  return age; // Гарантированно валидное число
}

const userAge = getValidAge();
console.log(`Тебе ${userAge} лет`);

Почему do-while здесь идеален:

  • Нужно показать prompt минимум один раз
  • Нельзя переходить к следующему шагу без валидных данных
  • Do-while избегает дублирования кода (не нужно вызывать prompt дважды)

Практический пример 2: Обработка API с повторными попытками (Retry logic)

Частая задача в фронтенде — переподключиться к API если произошла ошибка:

async function fetchDataWithRetry(url, maxRetries = 3) {
  let retryCount = 0;
  let data = null;
  let success = false;
  
  do {
    try {
      const response = await fetch(url, { timeout: 5000 });
      
      if (!response.ok) {
        throw new Error(`HTTP ${response.status}`);
      }
      
      data = await response.json();
      success = true;
    } catch (error) {
      retryCount++;
      console.log(`Попытка ${retryCount} не удалась: ${error.message}`);
      
      if (retryCount < maxRetries) {
        // Экспоненциальная задержка перед повтором
        const delay = Math.pow(2, retryCount) * 1000;
        console.log(`Ждем ${delay}ms перед повтором...`);
        await new Promise(resolve => setTimeout(resolve, delay));
      }
    }
  } while (!success && retryCount < maxRetries);
  
  if (!success) {
    throw new Error(`Не удалось получить данные после ${maxRetries} попыток`);
  }
  
  return data;
}

// Использование
fetchDataWithRetry('https://api.example.com/data')
  .then(data => console.log('Успех:', data))
  .catch(error => console.error(error));

Почему do-while:

  • Первая попытка должна выполниться всегда
  • Условие проверяется только после первого запроса
  • Логика retry становится понятнее

Практический пример 3: Игровая логика (Угадай число)

function playGuessGame() {
  const secretNumber = Math.floor(Math.random() * 100) + 1;
  let guess;
  let attempts = 0;
  
  do {
    guess = parseInt(prompt('Угадай число от 1 до 100:'));
    attempts++;
    
    if (guess === secretNumber) {
      console.log(`Правильно! Угадал за ${attempts} попыток`);
      break;
    } else if (guess < secretNumber) {
      console.log('Число больше');
    } else {
      console.log('Число меньше');
    }
  } while (attempts < 10);
  
  if (guess !== secretNumber) {
    console.log(`Не угадал. Число было ${secretNumber}`);
  }
}

playGuessGame();

Практический пример 4: Парсинг вложенных структур

Например, обход цепочки редиректов:

async function followRedirects(url, maxRedirects = 5) {
  let currentUrl = url;
  let redirectCount = 0;
  let finalUrl;
  
  do {
    console.log(`Запрос к: ${currentUrl}`);
    
    const response = await fetch(currentUrl, { redirect: 'manual' });
    
    if (response.status >= 300 && response.status < 400) {
      currentUrl = response.headers.get('Location');
      redirectCount++;
      console.log(`Редирект на: ${currentUrl}`);
    } else {
      finalUrl = currentUrl;
      break;
    }
  } while (redirectCount < maxRedirects);
  
  return finalUrl || currentUrl;
}

followRedirects('https://bit.ly/example')
  .then(url => console.log('Финальный URL:', url));

Практический пример 5: Парсинг данных с условием

Обработка очереди задач:

class TaskQueue {
  constructor() {
    this.tasks = [];
  }
  
  processTasks() {
    let processed = 0;
    
    do {
      const task = this.tasks.shift();
      
      if (task) {
        try {
          console.log(`Обрабатываю: ${task.name}`);
          task.execute();
          processed++;
        } catch (error) {
          console.error(`Ошибка при выполнении ${task.name}:`, error);
          // Вернуть задачу в конец очереди для повтора
          this.tasks.push(task);
        }
      }
    } while (this.tasks.length > 0 && processed < 10);
    
    return processed;
  }
}

const queue = new TaskQueue();
queue.tasks = [
  { name: 'Task 1', execute: () => console.log('Выполнено 1') },
  { name: 'Task 2', execute: () => console.log('Выполнено 2') },
];
queue.processTasks();

Do-while vs while: сравнение

// WHILE: может не выполниться
const value = null;

while (value) {
  console.log('Не выполнится'); // Никогда не выполнится
}

// DO-WHILE: выполнится минимум один раз
do {
  console.log('Выполнится один раз'); // Выполнится!
} while (value);

Когда использовать do-while

Идеально:

  • Валидация пользовательского ввода
  • Retry логика
  • Игровые циклы
  • Очереди задач
  • Парсинг данных с проверкой после выполнения

Когда лучше while:

  • Обработка массивов (нужно сначала проверить размер)
  • Итерация по коллекциям
  • Когда важно НЕ выполнять код если условие ложное

Итого

Do-while — это специализированный цикл для случаев, когда:

  1. Код должен выполниться минимум один раз
  2. Проверка условия требует результата первого выполнения
  3. Это делает код понятнее и безопаснее чем дублирование кода перед while
Приведи пример применения цикла while с первым блоком do | PrepBro