← Назад к вопросам
Приведи пример применения цикла 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 — это специализированный цикл для случаев, когда:
- Код должен выполниться минимум один раз
- Проверка условия требует результата первого выполнения
- Это делает код понятнее и безопаснее чем дублирование кода перед while