Сначала получите список идентификаторов, затем последовательно загрузите документы через map. Оберните операцию в flow и выдайте готовый список одним emit.
Создание цепочки запросов к API с помощью корутин
Сначала получите список идентификаторов, затем последовательно загрузите документы через 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.