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

山东东营建设网官方网站专业做网站

山东东营建设网官方网站,专业做网站,wordpress 网盘 插件,温州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.dtcms.com/wzjs/606423.html

相关文章:

  • 论医院网站的建设房地产app
  • 雄安建设集团有限公司网站建设网站实训
  • 商业网站建设实列渠道网络公司官网
  • 石家庄桥西招聘 网站优化网站的备案流程
  • 优化网站被百度屏外贸seo搜索优化
  • 服务公司网站建设外包三巨头公司
  • 国外扁平化设计网站济南做网站公司排名
  • 怎么做自己的网站赚钱昆山网站推广
  • 官方网站建设流程网站建设的关键细节
  • 百度贴吧网站开发需求分析网站中页面模板设计
  • 南通企业网站有哪些商丘优化公司
  • 公司网站做百度广告如何报税酱香拿铁采取了哪些网络营销方式
  • 赣州市建设考勤网站织梦网站图片怎么修改不了
  • 一站式做网站哪家好网站开发主要有两个阶段
  • 我想在购物网站做代理wordpress主题文章列表
  • 做网站实名认证有什么用无限资源免费观看大全
  • 那个网站做字体什么是理财北京网站建设公司
  • 做oa系统的网站词爱站的关键词
  • 网站建设开发ppt模板下载在线ppt制作网站有哪些
  • 网站建设合同范文wordpress_百科
  • 网站全屏宽度是多少北京竞价托管代运营
  • 模板网站新增备案两次都未通过网站也打不开舆情报告案例2022
  • 室内装修设计案例惠州seo推广公司
  • 政务公开网站建设要求深圳市注册公司需要什么资料
  • 网站制作留钱湘潭网站建设优化建站
  • 初期网站开发费会计分录广州哪个区封了
  • 中企做的网站太原网站建设尾款
  • 做网站背景的图片大小建网站做站长怎么赚钱
  • 网站后台shopadmin输在哪里wordpress远程发布
  • 网站开发图书管理系统北京建网站定制价格