For Loop End
Close a for-loop and collect its results
- flow
- initial_value1
- initial_value2
- initial_value3
- initial_value4
- initial_value5
- initial_value6
- initial_value7
- initial_value8
- initial_value9
- initial_value10
- initial_value11
- initial_value12
- initial_value13
- initial_value14
- initial_value15
- initial_value16
- initial_value17
- initial_value18
- initial_value19
- value1
- value2
- value3
- value4
- value5
- value6
- value7
- value8
- value9
- value10
- value11
- value12
- value13
- value14
- value15
- value16
- value17
- value18
- value19
This is the bottom bracket of a loop. On its own it does nothing interesting - its whole job is to sit at the end of a repeating section and tell ComfyUI "go back and do that again until we're done." It's always used as a pair: a loop-start node (easy forLoopStart, or easy loadImagesForLoop) opens the loop, your processing sits in the middle, and easy forLoopEnd closes it. ComfyUI itself has no built-in looping, so this pair is how you get one.
Why you'd reach for it
Looping unlocks the batch jobs a single-pass graph can't express cleanly:
- Run the same processing over every image in a folder (with
easy loadImagesForLoopas the start). - Generate N variations by iterating a counter and feeding it to a seed or an index switch.
- Iteratively refine - feed each pass's output back as the next pass's input, N times.
The key idea is the carried values. A loop usually needs to remember something between iterations: an accumulating list of results, a running total, the image from the previous pass. easy forLoopEnd is where those values loop back around. You wire what you want to carry into its initial_value sockets, and it feeds them back to the loop-start for the next round.
The inputs and outputs
flow(FLOW_CONTROL, required) - the loop-control signal from the matching loop-start node. This connection is the loop; without it, there's nothing to close.initial_value1… initial_value19 (any, optional) - the values you want carried across iterations. Wire your per-pass results (an updated list, a counter, the latest image) into these.value1… value19 (any) - the corresponding outputs, available once the loop completes, holding the final carried values.
You don't need all 19 - connect as many value channels as your loop actually accumulates. Most loops use one or two.
Installing it
ComfyUI Manager: search ComfyUI Easy Use, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-Use
then install the requirements (install.bat on Windows, else pip install -r ComfyUI-Easy-Use/requirements.txt) and restart.
Common issues
- The
flowwire is non-negotiable.easy forLoopEndmust be connected to a loop-start viaflow. A dangling end node, or one wired to the wrong start, is the most common reason a "loop" runs once or errors. - Match the value channels end to end. A value you carry has to line up between the start and end nodes -
value1at the end pairs with the corresponding channel at the start. Cross them and the wrong data circulates. - Loops multiply cost. Everything inside the loop body runs once per iteration, so a slow inner workflow times N iterations is exactly that slow. Test with a small iteration count first.
- Accumulate deliberately. If you want to keep every iteration's result, you have to build that up through the carried values (e.g. append to a list each pass) - the loop doesn't magically collect outputs for you. Save inside the loop body if you just want files on disk.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| flow | FLOW_CONTROL | — | |
| initial_value1opt | * | — | |
| initial_value2opt | * | — | |
| initial_value3opt | * | — | |
| initial_value4opt | * | — | |
| initial_value5opt | * | — | |
| initial_value6opt | * | — | |
| initial_value7opt | * | — | |
| initial_value8opt | * | — | |
| initial_value9opt | * | — | |
| initial_value10opt | * | — | |
| initial_value11opt | * | — | |
| initial_value12opt | * | — | |
| initial_value13opt | * | — | |
| initial_value14opt | * | — | |
| initial_value15opt | * | — | |
| initial_value16opt | * | — | |
| initial_value17opt | * | — | |
| initial_value18opt | * | — | |
| initial_value19opt | * | — |
Outputs (19)
| Name | Type | Description |
|---|---|---|
| value1 | * | — |
| value2 | * | — |
| value3 | * | — |
| value4 | * | — |
| value5 | * | — |
| value6 | * | — |
| value7 | * | — |
| value8 | * | — |
| value9 | * | — |
| value10 | * | — |
| value11 | * | — |
| value12 | * | — |
| value13 | * | — |
| value14 | * | — |
| value15 | * | — |
| value16 | * | — |
| value17 | * | — |
| value18 | * | — |
| value19 | * | — |