Все ноды/Logic & Flow/Iteration
Цикл While
Повторяет тело, пока условие истинно. «Начало» и «Конец прохода» — только ход выполнения, значения по ним не идут. «Готово» отдаёт то, что пришло на вход, а не то, что посчитало тело: результат складывайте сами — в переменную или в базу. Необязательный выход «Причина остановки» говорит, чем кончился цикл: условие стало ложным или упёрлись в предел проходов.
Тип в графе: while_loop
ExecSubgraph
Можно включить выход ошибки и обработать сбой отдельным путём.
Порты можно разделить на исполнение и данные (split ports).
Как попробовать
Повтор с ограничителем
Условие проверяется перед каждым проходом, поле «Проходов не больше» страхует от бесконечного цикла, порт «Причина остановки» объясняет остановку.
- Исполнение + данные
- Исполнение
Запускается сразу
Как применять
Берите эту ноду, когда число повторов заранее неизвестно и зависит от условия: опрашивать статус задачи, пока она не готова; повторять запрос, пока ответ не пройдёт проверку; уточнять результат модели, пока он не устроит. Если повторов ровно столько, сколько элементов в списке, нужен for_each, map или filter — они короче и понятнее. Собрать цикл вручную, ведя ребро из ветки обратно наверх графа, не получится: планировщик считает такой граф зациклённым и отказывается его запускать.
Как это работает
На input (Вход) приходит команда запуска и значение. Порты start (Начало) и end (Конец прохода)
ограничивают тело цикла — это чистые exec-порты, данные по ним не передаются. Порт
completed (Готово · исходные данные, не результат тела) срабатывает один раз после остановки и отдаёт то же значение, которое
пришло на input.
Условие вычисляется перед каждым проходом, включая первый: если оно ложно сразу, тело не
выполнится ни разу, а completed всё равно сработает. Тело обязано менять то, что читает
условие, — иначе цикл дойдёт до потолка. Значения между проходами передают переменные
(нода var_set, область Session) или выходы нод тела:
{{ nodes.<id>.output }}.
Число проходов ограничено дважды: полем «Проходов не больше» и общим потолком движка — по
умолчанию 100. Включённый порт status (Причина остановки) сообщает, почему цикл остановился:
condition_false или max_iterations; то же значение доступно как {{ nodes.<id>.status }}.
Пока цикл идёт, доступна служебная переменная {{ variables.loop_index }} — номер текущего
прохода, считая с нуля; после выхода из цикла она исчезает.
Частые ошибки
- Условие в смешанной форме. Как и у if, запись
{{ counter }} < 5 and {{ flag }}после подстановки перестаёт быть одним сравнением, а непустая строка истинна — цикл упрётся в потолок. Пишите условие целиком внутри{{ }}. - Опечатка в пути даёт ноль итераций. Несуществующий путь подставляется пустым, условие считается ложным, тело помечается «Тело цикла ни разу не выполнялось», а запуск — успешным. В журнале запуска остаётся предупреждение о нераспознанных путях.
- Счётчик по
loop_indexсмещён на единицу. На первой проверке переменной ещё нет, а на последующих она равна номеру предыдущего прохода, поэтому условиеloop_index < 2даёт три прохода. Точное число повторов задавайте полем «Проходов не больше». - Ожидание данных на порту «Начало» — это ребро несёт только команду исполнения.
- Переменная области Thread в условии. В
{{ variables.<имя> }}попадают только переменные области Session; значение thread-переменной читайте через выход её var-ноды. - Цикл внутри цикла отвергается валидатором: ставьте циклы последовательно или переносите внутренний обход в code_javascript.
- Пустое условие не задеплоится — выражение обязательно.
Входы
| Порт | Провод | Данные | Примечания |
|---|---|---|---|
Входinput | Исполнение + данныеexecute_data | — | Запускает шаг и приносит значение, которое без изменений уходит на выход «Готово». |
Конец проходаend | Исполнениеexecute | — |
Выходы
| Порт | Провод | Данные | Примечания |
|---|---|---|---|
Готово · исходные данные, не результат телаcompleted | Исполнение + данныеexecute_data | — | |
Началоstart | Исполнениеexecute | — | |
Причина остановкиstatus | Данныеdata | — | показывается, когда expose_status = true |
Настройки
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
Условиеcondition_expression | string | "" | Цикл продолжается, пока выражение истинно поддерживает шаблоны |
Показать причину остановкиexpose_status | boolean | false | Добавляет выход с причиной: условие стало ложным или упёрлись в предел проходов. Без него два исхода на холсте неразличимы — дальше идёт одна и та же ветка. |
Проходов не большеmax_iterations | integer | null | Оставьте пустым — тогда действует потолок вашего тарифа, и так и задумано. Число здесь может только понизить потолок, но не поднять: движок берёт меньшее из двух и разницу отбрасывает молча. |
Общие поля
Эти три поля есть у каждой ноды: платформа добавляет их сама, а не автор ноды.
expose_error_output— Если включено, показывает выход выполнения для подключения нод, которые запускаются при сбое этой ноды.split_ports_in— Показывать отдельные порты входа для выполнения и данных вместо одного объединённого.split_ports_out— Показывать отдельные порты выхода для выполнения и данных вместо одного объединённого.