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

建设信用卡网站是什么青岛网站优化公司

建设信用卡网站是什么,青岛网站优化公司,番禺网站建设哪家强,建设网站规划书最近项目中统一采用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/798986.html

相关文章:

  • 杭州网站建设方案wordpress菜单产品目录
  • 服务好的南京网站建设企业网站主页设计图片
  • 高中课程免费教学网站申请公司注册需要什么材料
  • 秦皇岛网站seo乌镇网站建设投标书
  • 自己公司网站维护wordpress portal
  • wordpress 架站 电子书php支持大型网站开发吗
  • 怎么做网站首页oa系统多少钱一套
  • 网络营销seo是什么意思整站seoseo优化
  • 安溪建设局网站毕节网站建设推广
  • 学做网站培训 上海有关网站升级建设的申请书
  • 网站建设网广州网站建设工程
  • 网站内页权重查询网络运营推广是做什么的
  • 北京网站设计与制作上海城乡建设部网站首页
  • 网站常用特效网站备案号被注销什么原因
  • 汽车最专业的网站建设深圳 网站设计公司
  • 目前做的比较好的法律网站有哪些个人承接网站建设
  • 徐州网站建设服务搭建 wordpress 简书
  • 万江区网站仿做常州网红打卡景点
  • 模板网站建设全过程番禺手机网站建设
  • 免费的工程信息网站怎么修改wordpress目录名字
  • 淄博做网站哪家好国外大型门户网站
  • 为什么要建立网站做网站设计和推广
  • 建湖专业做网站的公司电子商务网站建设概述
  • 建设工程企业资质工作网站wordpress 报名系统
  • 最好的网站推广软件大连公司
  • 青之峰网站建设哪家好东莞保安公司
  • 合肥网站建设哪家公司好chn域名注册网站
  • 自己家开了一家装修公司怎么做装修网站企业如何做网站推广
  • 做电气设计有哪些好的网站深圳制作网站软件
  • 网站建设与管理教学视频教程百度做的网站后台怎么更新