在一个函数中组合相同的流结构

问题描述 投票:0回答:1

下面的流程结构我用了将近5次以上。因为大部分零件都是一样的。每个作业都有一个单独的用例。每个用例返回

Flow<Resource<MyType>>
。如何在 job1、job2... 函数使用的公共函数中组合相同的部分?

工作1

    private var job1Job: Job? = null
    private fun job1(param: Param) {
        job1Job?.cancel()
        job1Job = useCases1(param)
            .onEach { resource->
                    myStateFlow.update {
                        it.copy(isConsumed = false,
                            resource = resource,
                        )
                    }
            }
            .catch {throwable->
                var currentTryCount = 
                var maxTryCount = 
                if ( throwable is BleReTryableError && currentTryCount < maxTryCount ) {
                    currentTryCount++
                    myStateFlow.update {
                        it.copy(isConsumed = false,
                            resource = Resource.Loading("loading message"),
                            currentTryCount = currentTryCount
                        )
                    }
                    throw BleReTryableError(throwable.message ?: "")
                } else {
                    myStateFlow.update {
                        it.copy(isConsumed = false,
                            resource = Resource.Error("error message"))
                    }
                }
            }
            .retry {
                delay(2500)
                it is BleReTryableError
            }
            .launchIn(viewModelScope)
    }

工作2

    private var job2Job: Job? = null
    private fun job2(param: Param) {
        job2Job?.cancel()
        job2Job= useCases2(param)
            .onEach { resource->
                    myStateFlow.update {
                        it.copy(isConsumed = false,
                            resource = resource,
                        )
                    }
            }
            .catch {throwable->
                var currentTryCount = 
                var maxTryCount = 
                if ( throwable is BleReTryableError && currentTryCount < maxTryCount ) {
                    currentTryCount++
                    myStateFlow.update {
                        it.copy(isConsumed = false,
                            resource = Resource.Loading("loading message"),
                            currentTryCount = currentTryCount
                        )
                    }
                    throw BleReTryableError(throwable.message ?: "")
                } else {
                    myStateFlow.update {
                        it.copy(isConsumed = false,
                            resource = Resource.Error("error message"))
                    }
                }
            }
            .retry {
                delay(2500)
                it is BleReTryableError
            }
            .launchIn(viewModelScope)
    }

工作3

    private var job3Job: Job? = null
    private fun job3(param: Param) {
        job3Job?.cancel()
        job3Job= useCases3(param)
            .onEach { resource->
                    myStateFlow.update {
                        it.copy(isConsumed = false,
                            resource = resource,
                        )
                    }
            }
            .catch {throwable->
                var currentTryCount = 
                var maxTryCount = 
                if ( throwable is BleReTryableError && currentTryCount < maxTryCount ) {
                    currentTryCount++
                    myStateFlow.update {
                        it.copy(isConsumed = false,
                            resource = Resource.Loading("loading message"),
                            currentTryCount = currentTryCount
                        )
                    }
                    throw BleReTryableError(throwable.message ?: "")
                } else {
                    myStateFlow.update {
                        it.copy(isConsumed = false,
                            resource = Resource.Error("error message"))
                    }
                }
            }
            .retry {
                delay(2500)
                it is BleReTryableError
            }
            .launchIn(viewModelScope)
    }

Job4,Job5 ....

或者做一个像下面这样的函数就足够了吗?

private fun myRun(flow: Flow<Resource<MyType>>) {

}

我也可以使用扩展方法

android kotlin kotlin-coroutines kotlin-flow flow
1个回答
0
投票

您可以像这样创建扩展函数:

fun <T> Flow<T>.process() {
    onEach { resource->
        myStateFlow.update {
            it.copy(isConsumed = false,
                resource = resource,
            )
        }
    }
    .catch {throwable->
        var currentTryCount =
        var maxTryCount =
            if ( throwable is BleReTryableError && currentTryCount < maxTryCount ) {
                currentTryCount++
                myStateFlow.update {
                    it.copy(isConsumed = false,
                        resource = Resource.Loading("loading message"),
                        currentTryCount = currentTryCount
                    )
                }
                throw BleReTryableError(throwable.message ?: "")
            } else {
                myStateFlow.update {
                    it.copy(isConsumed = false,
                        resource = Resource.Error("error message"))
                }
            }
    }
    .retry {
        delay(2500)
        it is BleReTryableError
    }
    .launchIn(viewModelScope)
}

然后像这样使用它

private var job1Job: Job? = null
private fun job1(param: Param) {
    job1Job?.cancel()
    job1Job = useCases1(param).process()
}

你拥有的每一份工作。

© www.soinside.com 2019 - 2024. All rights reserved.