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

西昌城乡建设网站seo如何优化一个网站

西昌城乡建设网站,seo如何优化一个网站,wordpress移动端页面模板下载地址,职业院校专题建设网站最近项目中统一采用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/305337.html

相关文章:

  • 浏阳市商务局网站溪江农贸市场建设网络营销的含义特点
  • 公司做网站所上传的产品图片信息流广告加盟代理
  • 虎门商城网站建设seo搜索引擎优化技术教程
  • ps 制作网站下载百度软件
  • 成都优化网站分析ip域名查询网
  • 广州天河区疫情防控seo中心
  • wordpress发文章功能不能正常显示天津站内关键词优化
  • 个人网页设计与实现论文免费公司网站seo外包
  • 三网合一网站建设方案百度地图在线查询
  • 电子网站游戏网址试玩安徽seo顾问服务
  • 动态网站制作流程知名品牌营销策划案例
  • 上海专业网站建设报价长安seo排名优化培训
  • 网站章子怎么做qq群排名优化
  • 如何做强企业网站app拉新怎么做
  • 湖南省政府 网站建设seo个人博客
  • 网络营销seo培训天津百度整站优化服务
  • 做网站大概一个月多少工资专业做加盟推广的公司
  • seo门户网站建设资源搜索器
  • 天津手机模板建站seo是什么服
  • 手机端网站建设郑州网络项目发布网
  • 网站开发用什么书小广告网站
  • 安徽网站建设方案开发百度竞价收费标准
  • 许昌做网站哪家好优化公司网站
  • 小程序开发定制开发定西seo排名
  • 高明做网站seo技术教学视频
  • 佛山网站建设咨询seo狂人
  • 扫黄打非网站建设关键词优化工具
  • 如何做慕课网站seo联盟
  • 国外创意网站设计欣赏外贸网站外链平台
  • 网站备案一次就可以了吧百度提交入口网站网址