> ## Documentation Index
> Fetch the complete documentation index at: https://docs.youka.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Задачи

> Проверяйте задачи и ожидайте завершения асинхронных операций

Каждая асинхронная операция в Youka в итоге выполняется как задача, но основная поверхность SDK теперь возвращает хэндлы операций вместо «сырых» ID задач. Большинству пользователей следует использовать `client.projects.wait(...)` или `client.exports.wait(...)` и обращаться к `client.tasks.*` только когда нужна низкоуровневая проверка задач.

## `client.tasks.get(taskId, options?)`

Получить текущее состояние задачи по ID.

```ts theme={null}
const task = await client.tasks.get("tsk_abc123");
console.log(task.status, task.type);
```

### Статусы задач

| Статус        | Терминальный? | Значение                                        |
| ------------- | ------------- | ----------------------------------------------- |
| `created`     | Нет           | Задача создана, но ещё не поставлена в очередь. |
| `queued`      | Нет           | Задача ожидает запуска.                         |
| `in-progress` | Нет           | Задача выполняется в данный момент.             |
| `completed`   | Да            | Задача успешно завершилась.                     |
| `finalized`   | Да            | Задача завершилась, и постобработка выполнена.  |
| `failed`      | Да            | Задача завершилась с ошибкой.                   |
| `cancelled`   | Да            | Задача была отменена.                           |
| `timed-out`   | Да            | Задача достигла лимита по времени.              |

## `client.tasks.wait(taskId, options?)`

Опрашивать задачу, пока она не перейдёт в терминальное состояние. При успехе возвращает итоговую задачу, при неудаче выбрасывает `YoukaTaskError`.

```ts theme={null}
const task = await client.tasks.wait("tsk_abc123", {
  pollIntervalMs: 3_000,
  signal: abortController.signal,
});
```

### Параметры

<ParamField path="pollIntervalMs" type="number">
  Миллисекунды между опросами. По умолчанию `2000`.
</ParamField>

<ParamField path="signal" type="AbortSignal">
  Прервать ожидание. Запрос «в полёте» и любая ожидающая задержка отменяются
  немедленно.
</ParamField>

### Ошибки

`client.tasks.wait(...)` выбрасывает `YoukaTaskError`, когда задача завершается в состоянии `failed`, `cancelled` или `timed-out`:

```ts theme={null}
import { YoukaTaskError } from "@youka/sdk";

try {
  await client.tasks.wait("tsk_abc123");
} catch (error) {
  if (error instanceof YoukaTaskError) {
    console.error(error.code); // TASK_FAILED | TASK_CANCELLED | TASK_TIMED_OUT
    console.error(error.task); // Full RestTask payload
  }
  throw error;
}
```

## `client.projects.wait(operation, options?)`

Дождаться завершения операции в рамках проекта, затем заново получить проект. Возвращает хэндл операции, терминальную задачу и обновлённый проект.

```ts theme={null}
const operation = await client.projects.create({
  source: { type: "path", path: "./song.mp3" },
});

const { project, task } = await client.projects.wait(operation, {
  pollIntervalMs: 2_500,
});

console.log("Project ready:", project.id);
console.log("Task finished in state:", task.status);
```

<ParamField path="operation" type="ProjectOperation" required>
  Обычно это результат `client.projects.create(...)`,
  `client.projects.separateStems(...)` или `client.projects.syncLyrics(...)`.
</ParamField>

## `client.exports.wait(operationOrId, options?)`

Дождаться, пока облачный экспорт не перейдёт в терминальное состояние. Передайте либо `ExportOperation`, возвращаемый `client.exports.create(...)`, либо строку `exportId`.

```ts theme={null}
const operation = await client.exports.create("prj_abc123", {
  resolution: "1080p",
  quality: "high",
});

const finalized = await client.exports.wait(operation, {
  pollIntervalMs: 3_000,
});

console.log(finalized.status, finalized.url);
```

## Отмена

Передайте `AbortSignal`, чтобы отменить длительное ожидание:

```ts theme={null}
const controller = new AbortController();

setTimeout(() => controller.abort(), 60_000);

try {
  await client.projects.wait(operation, { signal: controller.signal });
} catch (error) {
  if (error instanceof Error && error.name === "AbortError") {
    console.log("Wait cancelled after 60s");
  } else {
    throw error;
  }
}
```

Этот же сигнал также отменяет базовый запрос опроса задачи или экспорта.

## Что дальше

* [Errors](/ru/sdk/errors) — обработка `YoukaTaskError` и ошибок, допускающих повтор
* [Exports](/ru/sdk/exports) — ожидание завершения экспорта
* [API async jobs](/ru/api/async-jobs) — тот же паттерн в «сыром» HTTP
