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

Для каждого

Последовательно обходит JSON-массив с ED-порта «Input». Для каждого элемента запускает подграф между портами item и end (как у WF tool). Значение с порта end игнорируется; удобно для побочных эффектов.

Для каждого
ArrayResult
ItemItem

Тип в графе: for_each

ExecSubgraph

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

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

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

Обход массива с индексом

Шаблон достаёт массив из входа, цикл проходит его по одному элементу и пишет каждый в лог.

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

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

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

Берите эту ноду, когда над каждым элементом массива надо что-то сделать, а собирать результат не нужно: разослать письма по списку адресов, записать строки в коллекцию, отправить сообщения в мессенджер. Если из каждого элемента нужно получить новое значение — это map; если из массива надо отобрать часть элементов — filter; если повторов заранее неизвестное число и они зависят от условия — while_loop. Когда тело — это одно преобразование без обращений к сервисам, дешевле обойтись одной нодой code_javascript: цикл в графе стоит отдельной записи в журнале на каждую итерацию.

Как это работает

У ноды четыре порта. На input (Array) приходит массив и одновременно команда запуска. Порт item (Start) — начало тела цикла, порт end (End) — его конец; телом считаются все ноды, лежащие на путях от item к end. Порт completed (Done) срабатывает один раз, когда обход закончен.

Массивом считается JSON-массив или строка, которая его кодирует. Элементы обходятся строго по одному, по порядку. Без флага «Включить индекс» на item уходит сам элемент, и первая нода тела читает его как {{ inputs.input }}. С флагом уходит объект {<ключ элемента>: значение, index: N} — тогда это {{ inputs.input.item }} и {{ inputs.input.index }}, где имя ключа задаёт поле «Ключ элемента».

Значение, пришедшее на end, нода игнорирует — важен сам факт прохода. Результат ноды — число обработанных элементов: {{ nodes.<id>.output }}. В деталях запуска итерации видны отдельными группами «Итерация 1», «Итерация 2» и так далее.

Частые ошибки

  • На вход подан объект, а не массив. Из entry обычно приходит объект вида {"items": [...]}, и нода падает с «expected a list». Поставьте перед циклом template с {{ inputs.input.items | tojson }} — валидатор предупреждает об этой связи заранее.
  • Тело не замкнуто. Ребро из item и ребро в end обязательны оба, даже если значение на end не нужно: без любого из них воркфлоу не задеплоится.
  • Цикл внутри цикла. Вложенные циклы отвергаются валидатором. Ставьте их последовательно (Done первого → input второго) или переносите внутренний обход в code_javascript.
  • Ребро из тела «наружу». Всё, что продолжается от нод тела, считается частью тела и выполняется на каждой итерации. Продолжайте граф от порта completed.
  • Чтение результата тела снаружи. {{ nodes.<нода тела>.output }} за пределами цикла хранит значение последней итерации, а не всех сразу.
  • Ошибка одной итерации останавливает весь цикл. Оставшиеся элементы не обрабатываются. Если сбои ожидаемы, обработайте их внутри тела — веткой ошибки у самой рискованной ноды.

Входы

ПортПроводДанныеПримечания
ArrayinputИсполнение + данныеexecute_data

Run trigger and array payload (JSON array or string encoding an array).

ItemendИсполнение + данныеexecute_data

End of subgraph for one item; return value from inner graph.

Выходы

ПортПроводДанныеПримечания
ResultcompletedИсполнение + данныеexecute_data
ItemitemИсполнение + данныеexecute_data

Настройки

ПолеТипПо умолчаниюОписание
Включить индексinclude_indexbooleanfalse

Когда включено, каждая итерация передаёт словарь {item_key: element, index: n} на порт item. Когда выключено, порт item несёт само значение элемента массива (без обёртки-словаря).

Ключ элементаitem_variablestringitem

Ключ для текущего элемента в словаре payload (вместе с индексом) на порту item.

показывается при include_index = true

Общие поля

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

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