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

厦门网站建设 php爱站关键词挖掘软件

厦门网站建设 php,爱站关键词挖掘软件,php教育网站开发,抖音代运营投诉平台最近项目中统一采用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.shuangfujiaoyu.com/news/28511.html

相关文章:

  • 温州集团网站建设网络营销方案案例范文
  • 公司网站建设制作全怎么做推广
  • 网上招聘网站开发报告百度网讯科技有限公司官网
  • 挂机宝可以做网站抖音怎么推广
  • 大学作业旅游网站设计报告微博指数查询
  • 包头网站 建设it培训班出来现状
  • 知名的金融行业网站开发建站工具
  • 科技资讯网站开发大纲温州seo网站建设
  • 重庆网站开发工资宁波seo优化费用
  • 福州做网站公司排名百度旗下推广平台有哪些
  • 东莞南城做网站网络营销方案案例
  • 做网站的公司赚钱吗新闻发布
  • 靠谱seo外包合肥搜索引擎优化
  • 上海做网站比较有名的公司互联网营销师怎么报名
  • 中小企业网站制作不了常州seo第一人
  • 做微信公众号微网站榆林市网站seo
  • 怎么用vs2010做网站seo都用在哪些网站
  • 网站建设证书太原seo外包平台
  • 中企动力网站建设公司排名点击软件怎样
  • 做网站卖草坪赚钱吗广州seo网络优化公司
  • wordpress调用服务器文件夹seo查询 站长之家
  • 成都网站建设金网科技广州网站推广软件
  • 做网站一年要多少钱网络推广
  • 常用的软件开发工具有哪些搜索引擎优化的主要特征
  • 集团网站建设方案网络营销的策划流程
  • 做哪些网站流量最大买友情链接
  • b2b网站建设费用营销活动策划
  • 观澜专业做网站公司百度服务中心
  • 有那些网站做结伴旅游的重庆网络推广专员
  • 付费 视频 网站 怎么做佛山网站建设