网站建设项目实施方案,怎么查看网站是用什么编程语言开发的,全网优化哪家好,安溪学校网站建设最近项目中统一采用Kotlin的Flow来重构了网络请求相关代码。 目前的场景是#xff0c;接口在请求的时候需要一个accessToken值#xff0c;因为此值会过期或者不存在#xff0c;需要刷新#xff0c;因此最终方案是在使用Flow请求的时候先获取accessToken值然后再进行接口请求… 最近项目中统一采用Kotlin的Flow来重构了网络请求相关代码。 目前的场景是接口在请求的时候需要一个accessToken值因为此值会过期或者不存在需要刷新因此最终方案是在使用Flow请求的时候先获取accessToken值然后再进行接口请求而获取accessToken值的方法已经封装成了一个Flow并且做了缓存因此最后需要使用flatMapConcat操作符来连接真正需要的接口请求如果获取的accessToken无效又需要回头重新执行逻辑如下
判断本地是否存在accessToken并且是否过期不存在或者已过期则请求accessToken请求对应的接口如果返回结果中accessToken无效则重试
Flow提供了retry和retryWhen两种扩展方法来做重试操作
retry源码
public fun T FlowT.retry(retries: Long Long.MAX_VALUE,predicate: suspend (cause: Throwable) - Boolean { true }
): FlowT {require(retries 0) { Expected positive amount of retries, but had $retries }return retryWhen { cause, attempt - attempt retries predicate(cause) }
}retryWhen源码
public fun T FlowT.retryWhen(predicate: suspend FlowCollectorT.(cause: Throwable, attempt: Long) - Boolean): FlowT flow {var attempt 0Lvar shallRetry: Booleando {shallRetry falseval cause catchImpl(this)if (cause ! null) {if (predicate(cause, attempt)) {shallRetry trueattempt} else {throw cause}}} while (shallRetry)}但是retry和retryWhen只能通过异常来判断如果是通过返回结果来判断就需要借助外部变量来处理了因此基于源码扩展了方法retry可以接收请求结果从而通过请求结果来判断是否需要重试。
fun T FlowT.retry(retries: Long Long.MAX_VALUE, predicate: suspend (result: T) - Boolean { true }
): FlowT {require(retries 0) { Expected positive amount of retries, but had $retries }return flow {var attempt 0Lvar shallRetry: Booleando {shallRetry falsetry {collect {if (attempt retries predicate(it)) {shallRetry trueattempt} else {this.emit(it)}}} catch (e: Throwable) {throw e}} while (shallRetry)}
}最后的请求示例代码如下
MainScope().launch {getToken().flatMapConcat {if (it is Result.Success) {sendMobileCode()} else {emptyFlow()}}.retry(1) {returnretry (it is Result.Failure) (it.code ErrorStatus.ACCESS_TOKEN_ERROR)}.flowOn(Dispatchers.IO).onStart {callback?.onStart()}.catch {callback?.onError(it)}.onCompletion {callback?.onComplete(it)}.collectLatest { result -}}感谢大家的支持如有错误请指正如需转载请标明原文出处