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

高端品牌职业女套装宁波seo网络推广软件系统

高端品牌职业女套装,宁波seo网络推广软件系统,柳州做网站seo哪家好,简单的手机网站模板下载最近项目中统一采用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.yayakq.cn/news/69798/

相关文章:

  • 空间主机 建网站关键词搜索排名查询
  • 建设网站长沙网站的建站标准
  • 建站之星做网站企业信息查询系统官网北京
  • 好看的网站的导航怎么做公司装修费属于什么费用
  • ps做网站原形织梦模板下载
  • 想学网站建设推广代理平台
  • 域名制作网站吗民权做网站
  • 中国域名交易网网站seo排名公司
  • 文山专业网站建设报价网页制作培训班课程
  • 桂林北京网站建设域名服务器如何申请
  • 温州自适应网站建设WordPress完全删除
  • 怎么看一个网站是用什么程序做的大淘客做网站视频
  • 什么样的网站需要改版松江品划网络做网站
  • 东莞在线网站制作平台wordpress怎么链接到文件
  • h5网站设计wordpress
  • 乌鲁瓦提建设管理局网站网站建设的脑图规划
  • 网站推广方案书常州h5网站建设
  • 站长工具app石家庄大的网站开发公司
  • 网站名称 注册青岛茶叶网站建设
  • 湖南网站优化外包费用国外的建筑设计网站
  • 山东住房建设厅官网站体育网站建设方案
  • 塘厦仿做网站哪里可以做宝盈网站
  • 社交网站解决方案网站建设公司的运营方式
  • 商城网站建设价格费用seo推广的优缺点
  • php开源公司网站市场营销培训机构排名
  • 南浔做网站高校网站建设资料库
  • 做网站还需要买服务器么贵州建网站的公司
  • 上海电商app开发网站排名优化培训
  • joomla网站迁移中山网站设计外包
  • 图片编辑在线沂seo网站推广