Создание цепочки запросов к API с помощью корутин

Сначала получите список идентификаторов, затем последовательно загрузите документы через map. Оберните операцию в flow и выдайте готовый список одним emit.

Короткий ответ

Что ответить на собеседовании

Сначала получите список идентификаторов, затем последовательно загрузите документы через map. Оберните операцию в flow и выдайте готовый список одним emit.

Подробный разбор

Ответ с пояснениями

Условие

Для работы с внешним API имеются два suspend‑функции: первая отдаёт список идентификаторов документов, вторая – сам документ по переданному идентификатору. Требуется построить корутинный поток, который последовательно получит список id, а затем загрузит каждый документ, вернув итоговый список объектов Document.

suspend fun fetchIds(): List<String>
suspend fun fetchDocument(docId: String): Document

Ответ

Сначала получите список идентификаторов, затем последовательно загрузите документы через map. Оберните операцию в flow и выдайте готовый список одним emit.

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow

fun documentsFlow(): Flow<List<Document>> = flow {
    val ids = fetchIds()
    val documents = ids.map { id -> fetchDocument(id) }
    emit(documents)
}

Здесь используются Document и suspend-функции из условия. Вызовы fetchDocument последовательные, порядок документов совпадает с порядком id. Пустой список id даст пустой результат. Ошибка загрузки прервёт поток: частичный список не выдаётся.

Это холодный Flow — новый сбор повторяет запросы. suspend сам по себе не переносит блокирующую работу с UI-потока: реализация сетевого слоя должна быть неблокирующей либо выбирать подходящий dispatcher.

Источник: kotlinlang.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее