如何解决在 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)
}
解决方法
您的函数在调用时立即调用注销函数,然后返回原始 Flow 的包装版本,该版本将在收集时捕获错误。
要仅在发生错误时注销,您应该将调用移动到 catch
调用块内。它也不需要是挂起函数。
fun <T> Flow<T>.catchLoginError(action: suspend FlowCollector<T>.(Throwable) -> Unit): Flow<T> = catch { error ->
logOutIfUserHasNoAccount()
action(error)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。