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

怎样建立企业网站武汉网站排名推广

怎样建立企业网站,武汉网站排名推广,起重机网站怎么做,东营刚刚发生最近项目中统一采用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.qdjiajiao.com/news/1357.html

相关文章:

  • 仿163源码商城网网站模板交易平台源码整站打包企排排官网
  • 网站管理员登录入口品牌营销策划机构
  • 上海网站制作优化百度指数查询排行榜
  • 济源哪里做网站网站设计与制作毕业论文范文
  • 建站技术博客线上营销
  • 龙岗南联网站建设会计培训
  • 网站模板制作教程视频教程成都比较靠谱的seo
  • 合肥网站搜索引擎优化上饶seo博客
  • 本机网络ip做网站太原百度网站快速排名
  • 关于网站开发论文的摘要自动点击竞价广告软件
  • 用angular做的网站链接模板自助建站
  • 西宁百度seo流程优化的七个步骤
  • 怎么做淘宝客网站和APP网络优化工程师主要负责什么工作
  • 怎样在国外网站上做宣传网络营销主要干什么
  • 滨海网站建设公司推广放单平台
  • 网站做外链的方式西安网站关键词推广
  • 做网站seo优化百度最新人工智能
  • 展示用网站模板免费下载郑州seo优化顾问阿亮
  • WordPress做分类信息平台优化排名 生客seo
  • 企业网站宣传站长工具在线平台
  • 网站开发方向学啥搜索引擎排名2020
  • WordPress无刷新音乐seo在线短视频发布页运营
  • 淘客网站如何做苏州关键词优化软件
  • 网站搜索条怎么做搜索推广出价多少合适
  • 建设一个网站所需要注意的河南网站seo靠谱
  • 网站做压测西安seo建站
  • 如何注册免费网站seo代码优化步骤
  • 郑州作网站武汉网站设计
  • 新媒体网络营销的概念网站seo批量查询工具
  • 工厂找订单哪个平台最好网站优化培训