Все ноды/Logic & Flow/Iteration
Для каждого
Последовательно обходит JSON-массив с ED-порта «Input». Для каждого элемента запускает подграф между портами item и end (как у WF tool). Значение с порта end игнорируется; удобно для побочных эффектов.
Тип в графе: for_each
ExecSubgraph
Можно включить ветку ошибки (expose_error_output) и обработать сбой отдельным путём.
Порты можно разделить на исполнение и данные (split ports).
Как попробовать
Обход массива с индексом
Шаблон достаёт массив из входа, цикл проходит его по одному элементу и пишет каждый в лог.
- Исполнение + данные
Запускается сразу
Как применять
Берите эту ноду, когда над каждым элементом массива надо что-то сделать, а собирать результат не нужно: разослать письма по списку адресов, записать строки в коллекцию, отправить сообщения в мессенджер. Если из каждого элемента нужно получить новое значение — это 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_index | boolean | false | Когда включено, каждая итерация передаёт словарь {item_key: element, index: n} на порт item. Когда выключено, порт item несёт само значение элемента массива (без обёртки-словаря). |
Ключ элементаitem_variable | string | item | Ключ для текущего элемента в словаре payload (вместе с индексом) на порту item. показывается при include_index = true |
Общие поля
Эти три поля есть у каждой ноды: платформа добавляет их сама, а не автор ноды.
expose_error_output— Если включено, показывает выход выполнения для подключения нод, которые запускаются при сбое этого шага.split_ports_in— Показывать отдельные порты входа для выполнения и данных вместо одного объединённого.split_ports_out— Показывать отдельные порты выхода для выполнения и данных вместо одного объединённого.