Сначала подождите, затем обработайте остальные в фоновом режиме

У меня есть поток чего-то. И мне нужно написать функцию, которая как можно скорее возвращает первый элемент, а все последующие вызовы этих функций возвращают последнее значение потока.

val f = flow {
    emit(1)
    delay(100)
    emit(2)
}

suspend fun getLatest() = f.conflate().first() // this should be fixed, something like latest()

suspend fun main() {
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
}

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


person Pitel    schedule 27.08.2020    source источник


Ответы (1)


Потому что Flow - холодные потоки. Каждый раз, когда вы звоните first(), блокируйте

    emit(1)
    delay(100)
    emit(2)

будет называться снова.

В будущем SharedFlow будет добавлен в библиотеку, см. запрос на вытягивание, мы можем напишите так:

val f = flow {
    emit(1)
    delay(100)
    emit(2)
}

val coroutineScope: CoroutineScope = ...
val shared = f.conflate().shareIn(
        coroutineScope,
        replay = 1,
        started = SharingStarted.WhileSubscribed()
)

suspend fun getLatest() = shared.first() // this should be fixed, something like latest()

suspend fun main() {
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
    delay(100)
    println(getLatest())
}
person Petrus Nguyễn Thái Học    schedule 27.08.2020