---
name: "waitUntil"
type: command
status: ok
groups: ["Program Flow"]
arma3_since: "0.50"
locality: {"argument": null, "effect": null, "server_exec": false}
source: https://community.bistudio.com/wiki/waitUntil
revid: 378959
updated: 2026-09-03T14:52:35Z
---

# waitUntil

*Command · Program Flow · Arma 3 v0.50 · introduced in Armed Assault v1.00*

## Description

Suspends execution of [scheduled](../topics/Scheduler.md) script until the given condition satisfied.
- This command will loop and call the code inside `{}` **mostly every frame**, depends on complexity of the condition and the overall engine load, until the [code](../topics/Code.md) returns [true](../commands/true.md)
- If the very first execution of the code returns [true](../commands/true.md) the command will exit immediately, therefore it will not produce any "Suspending not allowed in this context" error when used inside [non-scheduled](../topics/Scheduler.md#unscheduled_environment) script. For all other uses it must be executed in environment that allows [suspension](../topics/Scheduler.md#suspension) ([canSuspend](../commands/canSuspend.md)), such as [spawn](../commands/spawn.md)ed or [execVM](../commands/execVM.md)ed code
- Avoid doing `waitUntil { time > 20 };` and use `sleep 20;` instead!
- If you can, add a [sleep](../commands/sleep.md) to the condition to save some cpu cycles `waitUntil { sleep 1; !alive player };`

> [!NOTE]
> **Arma 3:** Since Arma 3 v1.94, a *condition* returning anything other than [true](../commands/true.md) or [false](../commands/false.md) **will** result in an appropriate type error.

## Syntax

### Syntax 1

```sqf
waitUntil condition
```

**Parameters:**

- `condition`: [Code](../topics/Code.md) - the expression that **must** return a [Boolean](../topics/Boolean.md), [true](../commands/true.md) to finish waiting or [false](../commands/false.md) to continue waiting

**Returns:** [Anything](../topics/Anything.md) - the value the condition evaluates to when the wait is over (normally [true](../commands/true.md))

### Syntax 2

*since arma3 2.22*

```sqf
waitUntil [condition, timeout, interval]
```

**Parameters:**

- `condition`: [Code](../topics/Code.md) - the expression that **must** return a [Boolean](../topics/Boolean.md), [true](../commands/true.md) to finish waiting or [false](../commands/false.md) to continue waiting
- `timeout`: [Number](../topics/Number.md) - a timeout in seconds of game time ([sleep](../commands/sleep.md) vs [uiSleep](../commands/uiSleep.md)). The timeout is only checked after the condition was checked. **Any negative value disables the timeout**
- `interval`: [Number](../topics/Number.md) - (Optional, default 0) the time interval in seconds of game time between condition checks, this is equivalent to using a "sleep" after the condition.

**Returns:** [Anything](../topics/Anything.md) - the value the condition evaluates to when the wait is over (normally [true](../commands/true.md)), or [Nothing](../topics/Nothing.md) if the timeout ended the wait

### Syntax 3

*since arma3 2.22*

```sqf
waitUntil scriptHandle
```

**Parameters:**

- `scriptHandle`: [Script Handle](../topics/Script_Handle.md) - a script handle or [promise](../topics/Script_Handle.md) to wait on

**Returns:** [Anything](../topics/Anything.md) - The result of the script or [Promise](../topics/Script_Handle.md#promise_handles)

### Syntax 4

*since arma3 2.22*

```sqf
waitUntil [scriptHandle, timeout]
```

**Parameters:**

- `scriptHandle`: [Script Handle](../topics/Script_Handle.md) - a script handle or [promise](../topics/Script_Handle.md) to wait on
- `timeout`: [Number](../topics/Number.md) - a timeout in seconds of game time ([sleep](../commands/sleep.md) vs [uiSleep](../commands/uiSleep.md))

**Returns:** [Anything](../topics/Anything.md) - the result of the script or [Promise](../topics/Script_Handle.md#promise_handles). Or [Nothing](../topics/Nothing.md) if timed out.

## Examples

### Example 1

```sqf
waitUntil { not alive player };
```

### Example 2

```sqf
_i = 0; waitUntil { _i = _i + 1; _i >= 100 };
```

### Example 3

[waitUntil](../commands/waitUntil.md) can lead to performance loss if used improperly:

```sqf
waitUntil { not alive player };            // bad
waitUntil { sleep 1; not alive player };    // good - checks every 1 second
player addEventHandler ["Killed", {  }];    // best - don't forget about Event Handlers
```

### Example 4

An on-the-fly custom [event handler](../topics/Event_Handlers.md):

```sqf
_myEH = ["ZoomIn"] spawn {
    while { true } do
    {
        waitUntil { inputAction (_this select 0) == 1 };
        diag_log format ["%1 @ %2", _this select 0, diag_tickTime];
    };
};
```

Although it may be better to use [onEachFrame](../commands/onEachFrame.md) ([stacked](../functions/BIS_fnc_addStackedEventHandler.md)) [mission Event Handler](../topics/Mission_Event_Handlers.md#eachframe), depending on the application.

### Example 5

Use [getVariable](../commands/getVariable.md) with default value to prevent unexcepted script errors:

```sqf
waitUntil { bank getVariable ["money", 0] > 0 };
waitUntil { missionNamespace getVariable ["isready", false] };
```

### Example 6

Always return [Boolean](../topics/Boolean.md):

```sqf
waitUntil { sleep 1; if (not alive player) exitWith {}; _time = _time + 1 };                // bad
waitUntil { sleep 1; if (not alive player) exitWith { true }; _time = _time + 1; false };    // good
waitUntil { sleep 1; not alive player };                                                    // perfect
```

## Problems

For some unknown reason if you have [waitUntil](../commands/waitUntil.md) loop active and game is **saved/loaded**, some variables in the expression may appear undefined for a short time. As a workaround, assign expression to a variable and make sure it is defined before [waitUntil](../commands/waitUntil.md) checks it:

```sqf
waitUntil { private _expression = someBooleanVar && (someNumberVar > 10); !isNil "_expression" && { _expression } };
```

## See also

[sleep](../commands/sleep.md) · [uiSleep](../commands/uiSleep.md) · [canSuspend](../commands/canSuspend.md) · [spawn](../commands/spawn.md) · [execVM](../commands/execVM.md) · [while](../commands/while.md) · [Control Structures](../topics/Control_Structures.md)

## Community notes

**CrashDome** — 2006-12-20

waitUntil suspends both SQF functions and SQF scripts. In functions, the calling script is still in suspension due to waiting for a return from the [call](../commands/call.md) command. The game engine will continue, however. See Function for more detail.

---

**RoehrenRadio** — 2010-04-02

Prior to Arma 3 v1.94 if [waitUntil](../commands/waitUntil.md) uses an undefined [call](../commands/call.md) code, [waitUntil](../commands/waitUntil.md) won't release, even when this code is separated from other conditions through [or](../commands/or.md). Be warned that this won't cause an error message.

---

**Commy2** — 2014-12-13

If you want to use [waitUntil](../commands/waitUntil.md) together with [exitWith](../commands/exitWith.md), remember that the loop only exits if the code block returns true.

It should look like this:

```sqf
waitUntil {
    // exit loop if the unit gets deleted
    if (isNull _unit) exitWith { true }; // has to return true to continue

    !alive _unit;
};
```

---

**AgentRev** — 2022-04-19

It's a good idea to include a timeout with the condition if there's any possibility that it never becomes true:

```sqf
disableUserInput true;
player moveInDriver _vehicle; // this command is asynchronous and can fail sometimes
_time = time;
waitUntil {vehicle player == _vehicle || time - _time > 3};
disableUserInput false;
```

<sub>Source: [BI Community Wiki — waitUntil](https://community.bistudio.com/wiki/waitUntil) (revision 378959).</sub>
