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