Как связать Coroutine Flow? - PullRequest
0 голосов
/ 02 марта 2020

Я мог бы легко соединить coroutine Flow s, выполнив:

val someFlow = flow { //Some logic that my succeed or throw error }
val anotherFlow = flow { // Another logic that my succeed or throe error }

val resultingFlow = someFlow.flatmapLatest(anotherFlow)

, но что, если я хочу по отдельности быть в состоянии повторить попытку someFlow и anotherFlow, где, если someFlow уже удалось вернуть значение, но anotherFlow не удалось, я хочу повторить попытку anotherFlow, используя значение из someFlow (возвращаемое значение при успешном завершении).

Каков наилучший способ сделать это?

1 Ответ

1 голос
/ 02 марта 2020

Вы можете использовать оператор retryWhen для anotherFlow следующим образом:

val someFlow = flow { 
    //Some logic that my succeed or throw error 
}

val anotherFlow = flow { 
    // Another logic that my succeed or throe error 
}
.retryWhen { cause, attempt ->
    if (cause is IOException) {    // retry on IOException
        emit(“Some value”)         // emit anything you want before retry
        delay(1000)                // delay for one second before retry
        true
    } else {                       // do not retry otherwise
        false
    }
}

val resultingFlow = someFlow.flatmapLatest(anotherFlow)

Только будьте осторожны, потому что вы можете закончить повторную попытку навсегда. Используйте аргумент attempt для проверки количества повторных попыток.

Вот официальная документация оператора retryWhen: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/retry-when.html

...