当前位置: 首页 > news >正文

厦门网站建设 php推广通

厦门网站建设 php,推广通,做网站的困难,天津网站建设市场最近项目中统一采用Kotlin的Flow来重构了网络请求相关代码。 目前的场景是,接口在请求的时候需要一个accessToken值,因为此值会过期或者不存在,需要刷新,因此最终方案是在使用Flow请求的时候先获取accessToken值然后再进行接口请求…

在这里插入图片描述
最近项目中统一采用Kotlin的Flow来重构了网络请求相关代码。
目前的场景是,接口在请求的时候需要一个accessToken值,因为此值会过期或者不存在,需要刷新,因此最终方案是在使用Flow请求的时候先获取accessToken值然后再进行接口请求,而获取accessToken值的方法已经封装成了一个Flow并且做了缓存,因此最后需要使用flatMapConcat操作符来连接真正需要的接口请求,如果获取的accessToken无效,又需要回头重新执行,逻辑如下:

  1. 判断本地是否存在accessToken并且是否过期,不存在或者已过期则请求accessToken
  2. 请求对应的接口
  3. 如果返回结果中accessToken无效,则重试

Flow提供了retryretryWhen两种扩展方法来做重试操作:

retry源码

public fun <T> Flow<T>.retry(retries: Long = Long.MAX_VALUE,predicate: suspend (cause: Throwable) -> Boolean = { true }
): Flow<T> {require(retries > 0) { "Expected positive amount of retries, but had $retries" }return retryWhen { cause, attempt -> attempt < retries && predicate(cause) }
}

retryWhen源码

public fun <T> Flow<T>.retryWhen(predicate: suspend FlowCollector<T>.(cause: Throwable, attempt: Long) -> Boolean): Flow<T> =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)}

但是,retryretryWhen只能通过异常来判断,如果是通过返回结果来判断,就需要借助外部变量来处理了,因此基于源码扩展了方法retry,可以接收请求结果,从而通过请求结果来判断是否需要重试。

fun <T> Flow<T>.retry(retries: Long = Long.MAX_VALUE, predicate: suspend (result: T) -> Boolean = { true }
): Flow<T> {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) {return@retry (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 ->}}

感谢大家的支持,如有错误请指正,如需转载请标明原文出处!

http://www.khdw.cn/news/19646.html

相关文章:

  • 制作网页的过程中可以单击什么标签显示网页效果seoul怎么读
  • 怎么利用代码做网站企业网站模板html
  • 个人网站排版设计泉州关键词搜索排名
  • 不属于企业网站建设基本标准是获客
  • 北京工商局网站如何做股东变更友情链接检索数据分析
  • 如何查看网站做没做竞价电商数据统计网站
  • 视频网站做cpa百度指数三个功能模块
  • 做调差问卷的网站百度注册新账号
  • dedecms医院网站wap模板(橙色)百度发视频步骤
  • 网站怎么更新数据网页设计素材
  • 用pc机做网站并让外网搜到沈阳网站制作推广
  • 网站开发 岗位及职责在线代理浏览网站
  • 做电商网站报价实训百度搜索引擎的总结
  • dede网站怎么做单页面最新军事新闻
  • wordpress小工具css域名seo查询
  • 内蒙古微网站建设优化设计七年级上册数学答案
  • 做一网站APP多少钱seo搜索引擎优化步骤
  • 做网站之前需要准备什么长尾关键词网站
  • 黑色网站后台湖南长沙seo教育
  • 动态网站的常用软件360优化大师官方最新
  • 濮阳做网站四川网站制作
  • 徐州手机网站开发公司seo小白入门
  • 男女做暧昧视频网站网站服务公司
  • 二手东西怎么挂网上卖贺州seo
  • 代做计算机毕业设计网站关键词批量调词软件
  • 枣阳建设局网站中国培训网
  • 成品源码站快速排名上
  • 网站流行趋势武汉百度搜索优化
  • 海外 酒店 网站建设合肥seo推广培训班
  • 深圳保障性住房新政策北京网站优化效果