The curious tale of the result() function in Flow and LogicApps
/I owe this blog post to several persons, so I will list their names first:
Michael Greene asked on Twitter how to check success status of a scope
Michael references an LogicApps article on Create scopes that run workflow actions based on group status in Azure Logic Apps
Kevin Lam (LogicApps PM) replied regarding that article explaining the two errors that will be updated in the docs
I woke up to Kevin’s reply and something jolted me awake. See, I didn’t know there was a result() function, and it really isn’t documented at all in LogicApps Workflow Expressions. I have most of the functions memorized and I have never seen it.
Before I saw Kevin’s answer, I actually assumed it was an old article and the function doesn’t exist anymore.
I tried searching for it - I still don’t find it.
And it looks darn useful.
How often do you find a completely undocumented function in a language and the product manager doesn’t say it’s an incorrect function?
And that’s how I woke up early on Thursday morning.
Go read the example article and see what you think, before you continue. You only get one chance to ‘feel’ that excitement I had when I read the article, that expression, if you continue reading, I will spoil that for you. Go read it and wonder, may be even stop now, and go explore it yourself and then come back :)
We have work to do. If you like, I want to compare notes, my notes are below.
Plan
Experiment
Understand
Apply
Experiment
So we create a Flow and immediately add two Compose to test the result function.
This isn’t a completely crazy error - it tells me a few things
result function exists
it expects “actions of type ‘Enumerable < actions > ’
that looks like it expects actions that contains actions
Try the example in the docs, we do get it to work and can see its outputs.
Wrapping our test action inside a Scope, result(‘Scope’) returns actual real data.
It is a treasure trove of runtime information. Nested, grouped, runtime information.
Understand
Scope isn’t the only block in Flow that contains other actions, let’s try a few more of them
The Do Until block returns the final block and the repetitions.
The Apply to each block is extremely interesting. Because it returns outputs from every iteration. It is very very long.
Applications
The first application is to use this as a generic catch-all error.
Here’s a fancy Flow that tries to sometimes run a divide by zero.
This one is similar to the Logic Apps blog post - I use a fancy HTML table to show all the rows at once.
The second application is to use this as a very fast array append
This is a very common scenario where we want to group up individual apply-to-each results into an array for use after the apply-to-each block.
On one side - we have the traditional method of appending a line of result to a shared global array variable.
On the other side - we have apply-to-each and then we just output the result we want in a compose action. We use a Select after the apply-to-each to map the output from the result() function.
Apologies - the left/right of these screenshots toggled when I save and reload the Flow. So embarrassingly I have some of the pictures where result method is on the left, and other picture where the method is on the right.
Please refer to the two branches as "(result method)” and “(append method)”
If confused - please check the name of the apply-to-each block in the picture.
Change the apply-to-each to run in parallel
In parallel, the result() function is so amazing.
The 3rd Application is to run complex Select, using Apply-To-Each
and then use result() to gather the results, all without defining an array variable. This means you can run fairly complex apply-to-each block within a scope.
Bug
Because result() is a function that the Flow editor does not understand, it will save and run correctly, but the editor may mistakenly translate the expression to a string.
The main problem is that you may have a working Flow but when re-opening the Flow the editor turns an expression into a string and breaks the Flow, because it doesn’t understand that result() is a valid function.
I hope this bug is fixed soon.
Summary
result() is a cool function, and has some very important applications.