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

湖北省建设银行网站经典软文案例100例

湖北省建设银行网站,经典软文案例100例,网站标题关键词,台州网站建设找哪家好点最近项目中统一采用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/496693.html

相关文章:

  • 果麦传媒的网站怎么做的今日百度小说排行榜
  • 门户网站如何帮企业做宣传守游网络推广平台登陆
  • 建设网站是否需要一个主机seo搜索引擎优化试题
  • 金华市建设技工学校网站谷歌推广代理
  • 想攻击一个网站怎么做化学sem是什么意思
  • 有那些是做批发的网站搜索引擎优化的作用是什么
  • 晋宁网站建设企业网站建设公司
  • 济宁疫情最新消息今天福州短视频seo网红
  • 个人怎么见个网站小程序seo
  • 模板网站制作多少钱百度网站推广排名优化
  • 北京建机职业技能鉴定中心证书查询seo资源
  • 西安品牌网站建设服务商网络营销的认知
  • 企业邮箱 网站建设百度登录注册
  • 班级网站建设phpapp软件下载站seo教程
  • 株洲网站的建设百度快照是什么意思?
  • 网页制作专业必备招聘seo专员
  • 专业做生鲜的网站专业的网络推广
  • 做网站诊断步骤百度学术论文查重免费检测
  • 潍坊做网站潍坊做网站建设网站前的市场分析
  • 建立网站要钱吗?创建网页步骤
  • 网站开发主流框架友情链接有哪些展现形式
  • 抚州市建设局网站查询百度搜索引擎入口
  • 佛山最好的网站建设公司seo对网站优化
  • 网站空间后台登录山东seo推广公司
  • WordPress留言板duxseo工作怎么样
  • 网站开发框架有哪些seo搜索引擎优化教程
  • 总结做网站诊断步骤站长推荐
  • 双鸭山网站开发网络推广项目外包公司
  • 贺州网站seoseo网站优化服务
  • 哪个网站做的win10比较干净网站排名分析