Description
What would you like to be added?
Support for while or do-while loop constructs to simplify workflows that need to fetch paginated data from APIs until a condition is met (e.g., no more pages to fetch).
Proposal(s):
Currently, implementing workflows that require repetitive API calls until a condition is met (e.g., while nextPageToken is present) is cumbersome and verbose using the existing specification. There is no native support for loop constructs that check a condition after each iteration (i.e., a do-while pattern).
Proposal:
- Introduce a native while or do-while loop construct within the Serverless Workflow specification.
- Support a conditional expression (JQ) that evaluates whether the loop should continue.
- Allow a loopBody or array of steps to be executed within the loop.
- Optional: support max iterations to prevent infinite loops.
Example syntax (pseudo-DSL):
document:
dsl: '1.0.0'
namespace: test
name: paginated-fetch-example
version: '0.1.0'
do:
- fetchPaginatedData:
while: .hasNextPage == true
postConditionCheck: false // Enables do-while
maxIterations: 100
do:
- fetchPage:
call: getPageData
input:
pageToken: .nextPageToken
output: .fetchedData
- accumulateData:
run: mergeResults
input:
newData: .fetchedData
existingData: .accumulatedResults
output: .accumulatedResults
Alternative(s):
Currently, the same can be achieved by:
- Manually chaining states with
transition
and using aswitch
to re-enter a state based on a condition. - Using recursion with
workflow calls
, which increases complexity and reduces readability. - Implementing a custom function or orchestrator outside of the workflow itself.
These approaches are harder to read, maintain, and error-prone when retry logic and timeouts are introduced.
Additional info:
This feature would greatly improve:
- Workflows that deal with pagination (API data fetching, batch processing).
- Polling use cases where the data becomes available over time.
- Any retry-until-success or loop-until-condition patterns.
Let me know if you'd like me to open a PR to help explore this idea! Or do you think this can be achieved with current For loop? @ricardozanini @cdavernas
Community Notes
- Please vote by adding a 👍 reaction to the feature to help us prioritize.
- If you are interested to work on this feature, please leave a comment.
Metadata
Metadata
Assignees
Type
Projects
Status