---
title: "Waits"
description: "WaitFor returns a Wait with a wait type and the conditions to wait for."
canonical_url: "https://docs.superdurable.io/zh-Hans/reference/java/1.37.x/flows-and-steps/waits/"
source: "docs/reference-java_versioned_docs/version-1.37.x/flows-and-steps/waits.mdx"
locale: "zh-Hans"
---

# Waits

**WaitFor** returns a **Wait** with a wait type and the conditions to wait for.
Dex persists the waiting state and evaluates the conditions when related state
changes. [Timer](https://docs.superdurable.io/zh-Hans/concepts/primitives/timer.md), [Channel](https://docs.superdurable.io/zh-Hans/concepts/primitives/channel.md), and
[SubFlow](https://docs.superdurable.io/zh-Hans/concepts/primitives/subflow.md) are the condition kinds.

- **Until** waits for one condition.
- **AnyOf** is met when any condition is met.
- **AllOf** is met when all conditions are met.
- **AnyCombinationOf** is met when any one group of conditions is all met.

**Until**, **AnyOf**, and **AllOf** accept Conditions without condition IDs. Do
not add IDs merely because a Condition is nested in one of these waits. Read
Channel results from the Channel definition and inspect Timer outcomes through
the **Context**. Add IDs only when another API requires them, such as
**AnyCombinationOf** or a Timer selected by ID.

```java
return Wait.anyOf(
        channelA.forOne(),
        Timer.byDuration(timeout));
```

Example: [examples/java/src/main/java/io/superdurable/dex/primitives/waittypes/WaitTypesFlow.java](https://github.com/superdurable/dex/tree/main/examples/java/src/main/java/io/superdurable/dex/primitives/waittypes/WaitTypesFlow.java)

```java
return Wait.allOf(
        channelA.forOne(),
        channelB.forOne());
```

Example: [examples/java/src/main/java/io/superdurable/dex/primitives/waittypes/WaitTypesFlow.java](https://github.com/superdurable/dex/tree/main/examples/java/src/main/java/io/superdurable/dex/primitives/waittypes/WaitTypesFlow.java)

<a id="condition-results"></a>

## Condition results

After **WaitFor** completes, **Execute** can read what satisfied the Wait. For a
[Channel](https://docs.superdurable.io/zh-Hans/concepts/primitives/channel.md), use **GetConditionResults** / **results** /
**condition_results** to read published messages. For a
[SubFlow](https://docs.superdurable.io/zh-Hans/concepts/primitives/subflow.md), use **SubFlowResult** / **getConditionResults**
/ **condition_result** to decode the child Flow output.

Channel consumption is not greedy across **AnyOf** alternatives. Dex consumes
messages only from the Channel condition selected to satisfy the Wait. Other
Channel conditions consume nothing even if they are also ready, so their
messages remain queued.

When several **AnyOf** alternatives are ready in one evaluation, Dex selects
the first feasible candidate in canonical order: Timer conditions in
declaration order, then Channel conditions in declaration order, then SubFlow
conditions in declaration order. An earlier condition that is not ready does
not block a later ready condition. Mixed condition kinds therefore do not share
one global call argument order.

Use **AnyOf** for a race among the current alternatives. For strict priority
that must keep waiting for a higher-priority input, return only that condition
until it is resolved.

<a id="channel-结果"></a>

<a id="channel-results"></a>

### Channel results

```java
final class ChannelWaitStep implements Step<Integer> {
    @Override
    public Class<Integer> getInputType() {
        return Integer.class;
    }

    @Override
    public Wait waitFor(final Context context, final Integer input) {
        return Wait.anyOf(
                approval.forOne(),
                Timer.byDuration(Duration.ofSeconds(input)));
    }

    @Override
    public StepDecision execute(final Context context, final Integer input) {
        if (context.hasTimerFired()) {
            return StepDecision.gracefulComplete("approval timed out");
        }
        final List<String> approvals = approval.getConditionResults(context);
        return StepDecision.gracefulComplete(approvals.get(0));
    }
}
```

Example: [examples/java/src/main/java/io/superdurable/dex/primitives/channel/ChannelFlow.java](https://github.com/superdurable/dex/tree/main/examples/java/src/main/java/io/superdurable/dex/primitives/channel/ChannelFlow.java)

<a id="subflow-结果"></a>

<a id="subflow-results"></a>

### SubFlow results

```java
public StepDecision execute(final Context context, final Integer input) {
    final Integer output =
            SubFlow.getConditionResults(context).getSingleOutput(Integer.class);
    return StepDecision.gracefulComplete(SubFlow.getFlowId(context) + "|" + output);
}
```

Example: [examples/java/src/main/java/io/superdurable/dex/primitives/subflow/SubFlowParentFlow.java](https://github.com/superdurable/dex/tree/main/examples/java/src/main/java/io/superdurable/dex/primitives/subflow/SubFlowParentFlow.java)

<a id="anycombinationof"></a>

## AnyCombinationOf

**AnyCombinationOf** expresses an OR of AND groups. Build each inner group as
an all-of combination.

Channel consumption is not greedy across combinations. Dex consumes messages
only from Channel conditions in the selected combination. Conditions belonging
only to other ready combinations consume nothing, so their messages remain
queued.

Every Condition in its combinations requires a unique **condition ID**.

```java
return Wait.anyCombinationOf(
        ConditionCombination.of(
                channelA.forOne("signal-a"),
                Timer.byDuration(timeout, "timeout")),
        ConditionCombination.of(channelB.forOne("signal-b")));
```

Example: [examples/java/src/main/java/io/superdurable/dex/primitives/waittypes/WaitTypesFlow.java](https://github.com/superdurable/dex/tree/main/examples/java/src/main/java/io/superdurable/dex/primitives/waittypes/WaitTypesFlow.java)

<a id="step-execution-local"></a>

## Step execution local

**SetStepExecutionLocal** stores a value on this **StepExecution** so
**Execute** can read it with **GetStepExecutionLocal**. Use it when **WaitFor**
computes something **Execute** needs but a Flow-level **Attribute** is
overkill. Step input is already passed to both methods. Do not copy input into
a local.

```java
public Wait waitFor(final Context context, final Integer input) {
    context.setStepExecutionLocal("note", "approval:" + input, String.class);
    return Wait.until(approval.forOne());
}

public StepDecision execute(final Context context, final Integer input) {
    final String note = context.getStepExecutionLocal("note", String.class);
    return StepDecision.gracefulComplete(note == null ? "" : note);
}
```

Example: [examples/java/src/main/java/io/superdurable/dex/primitives/stepexecutionlocal/StepExecutionLocalFlow.java](https://github.com/superdurable/dex/tree/main/examples/java/src/main/java/io/superdurable/dex/primitives/stepexecutionlocal/StepExecutionLocalFlow.java)

<a id="skip-immediately"></a>

## Skip immediately

**SkipWaitImmediately** waits for no condition. Use it in a dynamic **WaitFor**
method when one branch must not wait for anything.

```java
return Wait.skipImmediately();
```

Example: [examples/java/src/main/java/io/superdurable/dex/primitives/flow/ExampleFlow.java](https://github.com/superdurable/dex/tree/main/examples/java/src/main/java/io/superdurable/dex/primitives/flow/ExampleFlow.java)
