Все ноды/Logic & Flow/Iteration

Цикл While

Повторяет тело, пока условие истинно. «Начало» и «Конец прохода» — только ход выполнения, значения по ним не идут. «Готово» отдаёт то, что пришло на вход, а не то, что посчитало тело: результат складывайте сами — в переменную или в базу. Необязательный выход «Причина остановки» говорит, чем кончился цикл: условие стало ложным или упёрлись в предел проходов.

Цикл While▶▦
ВходГотово · исходные данные, не результат тела
Конец проходаНачало
Причина остановки

Тип в графе: while_loop

ExecSubgraph

Можно включить выход ошибки и обработать сбой отдельным путём.

Порты можно разделить на исполнение и данные (split ports).

Как попробовать

Повтор с ограничителем

Условие проверяется перед каждым проходом, поле «Проходов не больше» страхует от бесконечного цикла, порт «Причина остановки» объясняет остановку.

Вход
Цикл While▶▦
Лог▶
Выход▶
  • Исполнение + данные
  • Исполнение
Нажмите «Скопировать ноды», откройте редактор и нажмите Ctrl+V на холсте.

Запускается сразу

Как применять

Берите эту ноду, когда число повторов заранее неизвестно и зависит от условия: опрашивать статус задачи, пока она не готова; повторять запрос, пока ответ не пройдёт проверку; уточнять результат модели, пока он не устроит. Если повторов ровно столько, сколько элементов в списке, нужен 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_expressionstring""

Цикл продолжается, пока выражение истинно

поддерживает шаблоны

Показать причину остановкиexpose_statusbooleanfalse

Добавляет выход с причиной: условие стало ложным или упёрлись в предел проходов. Без него два исхода на холсте неразличимы — дальше идёт одна и та же ветка.

Проходов не большеmax_iterationsintegernull

Оставьте пустым — тогда действует потолок вашего тарифа, и так и задумано. Число здесь может только понизить потолок, но не поднять: движок берёт меньшее из двух и разницу отбрасывает молча.

Общие поля

Эти три поля есть у каждой ноды: платформа добавляет их сама, а не автор ноды.

  • expose_error_output — Если включено, показывает выход выполнения для подключения нод, которые запускаются при сбое этой ноды.
  • split_ports_in — Показывать отдельные порты входа для выполнения и данных вместо одного объединённого.
  • split_ports_out — Показывать отдельные порты выхода для выполнения и данных вместо одного объединённого.