[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Task](https://evolu.dev/docs/api-reference/common/Task) › repeat

```ts
function repeat<T, E, D, Output>(
  task: Task<T, E, D>,
  schedule: Schedule<Output, T>,
  __namedParameters?: RepeatOptions<T, Output>,
): Task<T, E, D>;
```

Defined in: [packages/common/src/Task.ts:4159](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Task.ts#L4159)

Repeats a [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task) according to a [Schedule](https://evolu.dev/docs/api-reference/common/Schedule/type-aliases/Schedule).

Runs the Task once, then repeats while the Task returns [Ok](https://evolu.dev/docs/api-reference/common/Result/interfaces/Ok), the
schedule yields another delay, and [RepeatOptions.shouldRepeat](https://evolu.dev/docs/api-reference/common/Task/interfaces/RepeatOptions#shouldrepeat) returns
`true`. When repeating stops, `repeat` returns the last successful
[Result](https://evolu.dev/docs/api-reference/common/Result/type-aliases/Result). If the Task returns [Err](https://evolu.dev/docs/api-reference/common/Result/interfaces/Err), including [Done](https://evolu.dev/docs/api-reference/common/Result/interfaces/Done) from a
[NextTask](https://evolu.dev/docs/api-reference/common/Task/type-aliases/NextTask), `repeat` returns that error without scheduling another
attempt.

Use `repeat` for success-driven loops such as polling or consuming a
NextTask: it repeats after Ok and returns the Task's natural Result. Use
[retry](https://evolu.dev/docs/api-reference/common/Task/functions/retry) for failure recovery: it repeats after Err and wraps the final
domain error in [RetryError](https://evolu.dev/docs/api-reference/common/Task/interfaces/RetryError).

With `take(n)`, the Task runs n+1 times: the initial attempt plus n repeats.

### Repeating successes

```ts
import {
  assertEqual,
  assertOk,
  createRun,
  ok,
  recurs,
  repeat,
  type Task,
} from "@evolu/common";

let attempts = 0;
const checkStatus: Task<string> = () => {
  attempts += 1;
  return ok("pending");
};

const poll = repeat(checkStatus, recurs(3));

await using run = createRun();
assertOk(await run(poll), "pending");
assertEqual(attempts, 4);
```

### Stopping with Done

```ts
import {
  assertErr,
  assertEqual,
  createRun,
  done,
  err,
  ok,
  repeat,
  spaced,
  type NextTask,
} from "@evolu/common";

interface Item {
  readonly id: string;
}

const queue: Array<Item> = [{ id: "item-1" }];

const processQueue: NextTask<Item> = () => {
  const item = queue.shift();
  return item ? ok(item) : err(done());
};

await using run = createRun();
const result = await run(repeat(processQueue, spaced("1ms")));
assertErr(result, done());
assertEqual(queue, []);
```