Promise описывает состояние операции
Promise представляет будущий результат или причину неудачи. Пока операция не завершена, он находится в ожидании; затем становится выполненным либо отклоненным. Обработчики позволяют связать дальнейшие действия с этим исходом. Цепочка нужна, когда следующий шаг зависит от предыдущего: получить ответ, прочитать данные, проверить их структуру и только затем обновить представление. Возвращаемое значение обработчика влияет на следующий участок цепочки, поэтому потерянный return способен нарушить ожидаемую последовательность. Ошибка тоже является частью потока. Если ее только вывести в журнал и считать работу законченной успешно, вызывающий код может получить неверное представление о результате.
Await делает зависимость заметной
Асинхронная функция возвращает Promise. Внутри нее await позволяет дождаться результата, а при отклонении перейти к обработке ошибки. При этом ожидание не останавливает весь интерфейс: продолжение данной функции откладывается, пока другие события могут обрабатываться. Последовательные await уместны при зависимости действий. Независимые операции можно сначала запустить, а затем совместно ожидать их результаты, например через Promise.all. Однако одновременный запуск не всегда желателен: он должен учитывать нагрузку и допустимое количество запросов. Выбор определяется зависимостями и ограничениями задачи, а не правилом всегда выполнять все параллельно.
Успешный ответ тоже бывает ненужным
Вернемся к поиску города. Запрос А отправлен раньше, запрос Б позже, но Б завершился первым. Если после этого А без проверки заменит список, пользователь увидит данные для старого ввода. Один способ контроля заключается в последовательном номере запроса: перед обновлением сравнивают номер ответа с номером последнего актуального запроса. Отмена предыдущей операции может экономить ресурсы, но сама по себе не заменяет продуманную проверку состояния. Полезно отдельно хранить признаки ожидания, ошибки и пустого результата. Пустой список означает, что совпадений нет, а ошибка означает, что достоверный ответ не получен. Эти состояния требуют разных сообщений.
Попробуйте на практике
Смоделируйте два поисковых запроса на бумаге без подключения к серверу.
- Запишите четыре события: запуск А, запуск Б, успешный ответ Б и успешный ответ А. Присвойте запросам возрастающие номера.
- Для каждого события укажите текущий номер запроса и то, что должен показывать интерфейс: ожидание, актуальный список или прежнее состояние.
- Добавьте правило обновления только при совпадении номера ответа с текущим номером и повторно пройдите последовательность.
- Повторите разбор для ошибки Б и позднего успеха А, отдельно определив сообщение об ошибке и правило сохранения ранее показанных данных.
Как проверить результат. Поздний ответ А не заменяет актуальное состояние Б. Ошибка не превращается в пустой успешный список, а правила отображения определены для обоих сценариев.
Частые вопросы
Async автоматически выполняет тяжелые вычисления в другом потоке?
Нет. Само объявление функции асинхронной не переносит вычисления из текущего потока. Длительная синхронная работа внутри нее по-прежнему может задерживать обработку интерфейса.
Достаточно ли одного обработчика ошибки в конце?
Для некоторых цепочек этого достаточно, но решение зависит от границ ответственности. Важно понимать, какие ошибки он перехватывает, что возвращает после обработки и какое состояние увидит вызывающий код.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.