# Асинхронні операції

Деякі операції MoreLogin приймають завдання до того, як пов'язаний браузер, хмарний телефон, файл, застосунок або виконання RPA досягне кінцевого стану. Успішна відповідь на надсилання означає, що запит прийнято, але не завжди означає, що запитаний стан уже досягнуто.

## Модель станів на клієнті

| Стан | Сенс | Дія клієнта |
|  --- | --- | --- |
| Надіслано | API прийняв команду або створив задачу | Збережіть повернені ID та `requestId`; не надсилайте той самий запис одразу повторно |
| Очікує або виконується | Подальша операція все ще триває | Опитуйте задокументований ендпоінт стану/результату зі зростаючими інтервалами |
| Успішно | Цільовий ресурс або задача досягла успішного кінцевого стану | Припиніть опитування та продовжуйте сценарій |
| Невдало | Ендпоінт стану/результату повідомляє про помилку або кінцеву бізнес-помилку | Припиніть автоматичні повтори; збережіть ID, деталі помилки та `requestId` |
| Результат невідомий | Запис завершився тайм-аутом або з'єднання закрилося без придатної відповіді | Перед рішенням про повтор запитайте поточний стан ресурсу або задачі |


## Правила опитування

- Починайте приблизно з 1 секунди, далі збільшуйте інтервал до 2, 4, 8 секунд з обмеженням 15–30 секунд.
- Додавайте дрижання, щоб кілька клієнтів не опитували в один момент.
- Зупиняйтеся на задокументованому кінцевому стані; не опитуйте безкінечно.
- Вважайте `data: null` очікуванням лише тоді, коли ендпоінт явно документує таку поведінку.
- Тайм-аут передавання під час запису не є доказом невдачі.


## Задокументовані сценарії

| Сценарій | Операція надсилання | Операція спостереження | Кінцевий стан |
|  --- | --- | --- | --- |
| Запуск/зупинка хмарного браузера | `POST /cloudbrowser/start` або `/cloudbrowser/stop` | `POST /cloudbrowser/page` | Середовище виконання досягає потрібного стану або зникає після зупинки |
| Живлення хмарного телефона | `POST /cloudphone/powerOn` або `/cloudphone/powerOff` | `POST /cloudphone/page` | `envStatus=4` увімкнено або `envStatus=2` вимкнено; `1` — помилка створення |
| Завантаження файлу на хмарний телефон | Завантажте за підписаним URL, потім `POST /cloudphone/uploadFile` | `POST /cloudphone/uploadFileResult` | `status=1` успіх або `status=2` невдача; `data: null` і `status=0` — очікування |
| Завантаження з хмарного телефона | `POST /cloudphone/download` | `POST /cloudphone/download/result` | `status=20` успіх, `30` невдача або `40` скасовано; `10` — виконується |
| Установлення застосунку | `POST /cloudphone/app/install` | `POST /cloudphone/app/installedList` | Запитаний пакет з'являється у списку встановлених застосунків |
| Розклад/виконання RPA | `POST /cloudphone/rpa/task/save` або `/onceTask/save` | `POST /cloudphone/rpa/task/page`, `/subTask/page` та `/subTask/detail/{id}` | `taskState=2` завершено або `3` скасовано; перевірте `handleResult` (`0` невдача, `1` успіх) |
| Прямі трансляції | `POST /cloudphone/live/start` або `/live/end` | `POST /cloudphone/live/status` | Статус підтверджує, що трансляція почалася або зупинена |
| Завантаження у хмарне сховище | `POST /cloudstorage/upload/init`, потім `PUT` до об'єктного сховища | `POST /cloudstorage/upload/complete` після успіху кожного потрібного PUT | Запит завершення успішний; ніколи не викликайте complete до успішного завантаження об'єкта |


Аналоги в Local API використовують префікс `/api` там, де це задокументовано. Рекомендації щодо кожної операції див. у [Матриці повторів і завершення операцій](/uk/api-reference/getting-started/endpoint-behavior).

## Приклад відновлення після тайм-ауту

```python
try:
    submit_operation()
except TimeoutError:
    # The write may already have succeeded.
    current = query_current_state()
    if current.is_terminal_success:
        pass
    elif current.is_pending:
        poll_until_terminal()
    else:
        decide_whether_retry_is_safe(current)
```

Публічний API зараз не визначає загального заголовка ключа ідемпотентності. Тому ID ресурсів, ID задач, запити стану та `requestId` критичні для безпечного відновлення.