在 Flow<T>.catch 上写扩展函数

Write extension function on Flow<T>.catch

我想修改默认 Flow.catch 函数并始终调用特定的挂起函数 logOutIfUserHasNoAccount()。我当前的实现是:

private suspend fun <T> Flow<T>.catchLoginError(action: suspend FlowCollector<T>.(Throwable) -> Unit): Flow<T> {
    logOutIfUserHasNoAccount()
    return catch(action)
}

我的问题是:我的 Flow.catchLoginError 函数也是一个挂起函数,有什么缺点吗? catch的默认实现是:

// Not suspending
public fun <T> Flow<T>.catch(action: suspend FlowCollector<T>.(Throwable) -> Unit): Flow<T> { /* compiled code */ }

使用

suspend fun login() = flow {

}.catchLoginError( e -> 
 // here it should call "logOufIfUserHasNoAccount" first
 doStuff(e) 

}

您的函数在被调用时会立即调用注销函数,然后然后 returns原始流的包装版本,在收集时会捕获错误。

要仅在发生错误时注销,您应该将调用移到 catch 调用块中。它也不需要是一个挂起函数。

fun <T> Flow<T>.catchLoginError(action: suspend FlowCollector<T>.(Throwable) -> Unit): Flow<T> = catch { error ->
    logOutIfUserHasNoAccount()
    action(error)
}