Why You Should Love Do Untils in Power Automate
Tags: powerautomate, powerplatform, rpa, nocode
Published: 2023-03-01 11:53:10

`Do Untils` are a bit of an enigma to me, when comparing them to programming they are obviously 'Do Until/While' (normally the least used), but with the limit setter they are also like 'For Condition' (e.g i=0;i<10;i++). That leaves `ForEach`, which is obviously a 'For Each Item'. So Do Until in theory covers 2 loop types, making it more flexible, yet I see it very rarely used.

The question is why, why are `Do Untils` so unloved, I suspect there and are probably 3 reasons:

The auto action is to create a `ForEach` (if you add an array element into an input it automatically puts that action into  `ForEach` action). So every developers first interaction with a loop will most likely be a `ForEach`, setting that behaviour.

`ForEachs` work, 99 times out of 100 they do what we need well.

People don't know the benefits of a 'Do Until'.

So what are the benefits:

## Limit Loop Interactions
Yes you can limit the number of returns to set a size of an array, indirectly setting the loop size But what happens if its 2 arrays stacked together or if its the last x items. With a `Do Until` you can set the Count, which is the maximum iterations (like the for i=0;i<100;i++). 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6l6gxzzw3rgfd19q4s36.png)

## Time Box
This is more of a niche scenario but you can set the timeout of the `Do Until`, so like the count, you can set the loop to end after x mins/hours. You can also use the condition by checking utcNow against a future timestamp.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hfys33oh18vsahpwrxv4.png)

## Rolling Total
Filters & queries are great for finding a set value, but what happens if you need to find the first x rows that add up to a set value. This is where a `Do Until` is perfect again.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9f6mp3x57xr5tc8o7de.png)

## Offset Lists
`For Each` only iterates in 1s, where `Do Until` can iterate in any amount (e.g. what if you wanted only even numbers, then you could use an array position and double increment)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ch0yvodp2uth0m55bzq.png)

 
And remember, a `Do Until` can be used for every item, just like a `For Each` (So a `Do Until` can do everything a `For Each` can do).

---

My favourite example (and my most used) of a `Do Until` is with API limits. If your connector has return limits without built in pagination a `Do Until` can help. We can use to create our own pagination, with the Get call inside a `Do Until`. The Get has a filter set to return IDs/count greater than a variable (defaulted to 0). The results are appended to an array variable, and the `Do Until` condition checks if the return limit was returned, if it was then it sets the ID/count variable to greater then the last ID)count and repeats. 
_SharePoint has built in pagination so wouldnt need this solution but I used it for demonstration purposes_

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/27ldcz1yvwpsahq1jiwk.png)

**Append GetItems to array**
`union(variables('aItems'),outputs('Get_items')?['body/value'])`
**Get last ID**
`last(outputs('Get_items')?['body/value'])?['ID']`

---


I still find it hard not to just put an array value as an input and let Power Automate auto create the loop (I'm far to lazy), which I said is always a `For Each`. But I am using `DoUntils` more and more, and I'm finding an added benefit in planning my loops, not just auto creating them, as you often find better, simpler, more efficient solutions when planned.

In most cases `For Each` will do, but that doesn't mean it's the best solution.