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

扬州网站建设要多少钱吉林省建设厅网站杨学武

扬州网站建设要多少钱,吉林省建设厅网站杨学武,设计软件solidworks,优化方案化学最近项目中统一采用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/784657/

相关文章:

  • 网站开发过程中遇到的问题网站建设每天的工作
  • 如何提升网站的搜索排名威海建设集团网站首页
  • 网站自助建站中文网站编辑
  • 搭建网站做财务系统做网站类网站费用
  • 上海地产网站建洛阳尚贤网络科技有限公司
  • 帮别人做设计图的网站上海网站建设免费推荐
  • 去哪儿网站建设需要哪些技术上传网站工具
  • 做cpa联盟必须要有网站吗长沙公司有哪些
  • 佛山做网站优化北京的建设网站公司
  • SEO案例网站建设价格南通 网络 公司网站
  • 建个网站 费用时尚wordpress免费主题下载
  • 做电商网站的设计思路有什么意思做外贸有哪些平台
  • 摄影学校网站模板金蝶进销存免费版
  • 免费域名注册推荐网站如何做搜索引擎优化
  • 北京市住房与城乡建设厅网站福州开发公司
  • 西安便宜的网站建设网上注册平台怎么注册
  • 广告联盟没网站可以做吗郑州市建设集团
  • 企业网站搜索优化网络推广青岛航拍公司
  • 上海网站制作计划wordpress doc 插件
  • html网站建设中游戏开发培训班
  • 怎样做美瞳网站免费做团购网站的软件
  • 风机网站怎么做wordpress3.8.1中文版
  • 深圳专业做网站的公司哪家好注册公司名字大全免费
  • 织梦网站模板如何安装教程电话做网站的推广
  • 使用WordPress没有发布按钮seo网上培训多少钱
  • 电子商务网站建设试卷.doc建设淘宝网站需要多少钱
  • 网站导航设计视频网站开发背景
  • 北滘 网站建设用wordpress建立学校网站
  • 郑州专业网站设计公司东盟建设投资有限公司网站
  • 网站建设公司对比分析报告厦门人才网唯一官方网站登录入口