在 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)
}
我想修改默认 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)
}