--- referenceVersion: 2 --- # Циклы `loop` объединяет перебор коллекции (`each`) и повтор до условия (`until`). ## Параметры | Поле | Назначение | По умолчанию | | --- | --- | --- | | `mode` | `each` или `until` | Обязательно | | `steps`, `outputs` | Тело и результат итерации | Обязательно | | `items` | Массив для `each` | Обязательно для `each` | | `max_items` | Предельное число элементов до начала работы | 100 | | `concurrency.limit` | Одновременные элементы `each`, 1–8 | 2 | | `on_error` | `fail` или `collect` для `each` | `fail` | | `until` | Условие завершения `until` | Обязательно для `until` | | `max_iterations` | Положительный лимит итераций `until` | Обязательно для `until` | | `interval_seconds` | Пауза между повторениями | 0 | | `on_exhaust` | `fail` или `return` | `fail` | | `initial_state`, `next_state` | Начальное состояние и обновление `until` | `{}`, не задано | | `when` | Условие выполнения всего цикла | Без условия | ## Пример ```yaml [Обработать каждый элемент] - id: batch loop: mode: each items: "{inputs.records}" max_items: 100 concurrency: {limit: 2} steps: - id: record block: data params: operation: build value: index: "{loop.index}" item: "{loop.item}" outputs: record: "{record.value}" ``` ## Результат `each`: `items: [{index, status, output, error}]`, `count`; порядок исходного массива сохраняется. В теле доступны `{loop.item}`, `{loop.index}` с нуля, `{loop.count}`. `until`: `iterations`, `satisfied`, `last`, `state`. В теле доступны `{loop.iteration}` с единицы и `{loop.state}`. ## Поведение Пустой `each` успешен; превышение `max_items` отклоняется до начала. `collect` собирает ошибки по элементам. `fail` прекращает запуск новых элементов и дожидается активных. Согласование элемента не повторяет завершённых соседей. `until` выполняет тело минимум один раз, последовательно: собирает `outputs`, обновляет `next_state`, затем проверяет `until`. Лимит также ограничивается настройками установки. При исчерпании `fail` останавливает путь, `return` возвращает `satisfied=false` и последнее значение. ## Пример until ```yaml [Повторять запрос до готовности] - id: wait_result loop: mode: until max_iterations: 5 interval_seconds: 2 steps: - id: poll block: http params: url: "{inputs.status_url}" outputs: response: "{poll.json}" until: value: "{poll.json.ready}" op: equals expected: true ``` Для переноса данных между итерациями используйте `initial_state` и `next_state`; не читайте историю по скрытым именам шагов.