Что такое…

Что такое цикл — и почему он может не сработать ни разу

Иллюстрация: конвейер, по которому едут карточки — и пустая лента, на которой не едет ничего

Цикл объясняют так: «код, который повторяется N раз». Звучит понятно — и мешает на практике. Потому что в настоящем коде ты почти никогда не знаешь это N заранее.

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

Что такое цикл

Цикл — это способ сказать «сделай одно и то же для каждого элемента», не переписывая код для каждого элемента вручную.

Без цикла ты пишешь:

console.log("чай")
console.log("мёд")
console.log("лимон")

Три строки на три товара. А на триста товаров? Именно здесь появляется цикл:

for (const item of cart) {
  console.log(item)
}

Читается почти по-русски: «для каждого item из cart — выведи его». Код один, товаров сколько угодно. Добавился четвёртый — ничего не правишь.

Обрати внимание, откуда берётся число повторов. Ты его не писал. Оно равно длине массива — сколько элементов, столько кругов.

Три вида циклов, которые ты увидишь в коде от ИИ

Формально видов больше, но встречаются в основном эти.

  • for...of — пройти по списку. Самый частый. «Для каждого элемента — сделай». Число повторов берётся из длины списка.
  • for со счётчикомfor (let i = 0; i < 10; i++). Здесь ты задаёшь число сам. Нужен, когда важен сам номер шага, а не элемент.
  • while — крутиться, пока условие верно. Число повторов неизвестно даже во время работы: «пока не закончились страницы», «пока сервер отвечает „ещё есть“».

Ещё есть map и forEach — это тоже обход списка, просто записанный короче. Когда в коде появляется items.map(...), там внутри тот же цикл, только спрятанный.

Почему ноль повторов — это нормально

Вот главное, что стоит унести.

const cart = []
for (const item of cart) {
  console.log(item)   // сюда не зайдёт никогда
}

Ошибки нет. Предупреждения нет. Цикл честно посмотрел на список, увидел ноль элементов и завершился, не сделав ничего.

Это объясняет самую частую жалобу новичка: «экран пустой, но в консоли чисто». Он и должен быть чистым. Код отработал идеально — просто данных было ноль. Если сталкиваешься с таким, причину ищи не в цикле, а в самом списке: он либо ещё не успел прийти, либо его отфильтровали досуха.

Из этого же следует практическое правило. Всё, что должно случиться хотя бы раз, нельзя класть внутрь цикла по списку. Заголовок раздела, строчка «ничего не найдено», закрытие соединения — им не место в теле, которое может не выполниться.

Когда цикл не останавливается

Обратная беда — цикл, который крутится вечно и вешает вкладку. Практически всегда это while, у которого условие не меняется:

let page = 1
while (page <= total) {
  loadPage(page)
  // page никто не увеличил — условие вечно истинно
}

Проверка на глаз простая: найди в теле строку, которая двигает цикл к выходу. Нет такой строки — цикл вечный. В for...of этой болезни нет: список конечный, обход сам закончится.

Отдельно стоит не путать это с «циклом агента». Когда ИИ-агент раз за разом дёргает инструменты, пока не решит задачу, — это агентный цикл, другая история и другие причины зависаний.

Цикл и асинхронность — место, где ломаются все

Есть ловушка, на которой спотыкается каждый, кто просит у ИИ «пройди по списку и загрузи данные».

Цикл сам по себе не умеет ждать. Если внутри каждого круга асинхронная операция — запрос к серверу, чтение файла — то обычный forEach запустит все запросы разом и помчится дальше, не дождавшись ответов. Ты получишь пустой результат и никакой ошибки.

Лечится тем, что ожидание пишут явно: for...of вместе с await честно ждёт каждый круг. Практический приём: когда просишь ИИ такой код, добавь в промпт «дождись каждого запроса перед следующим». Формулировка короткая, а спасает от вечера отладки.

Чем for отличается от while?

Числом повторов. for...of идёт по готовому списку — конец известен заранее. while крутится, пока условие истинно, и заранее конца не знает. Если не уверен — бери for...of: он не зациклится.

Цикл замедляет приложение?

Сам по себе почти никогда: миллион простых шагов процессор проходит мгновенно. Тормозит другое — запрос к серверу или к базе внутри цикла: сто элементов превращаются в сто запросов. Хороший приём — вынести запрос наружу и получить все данные одним разом.

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →