HarmonyOS 如何进行同步代码编程

网络请求使用cookie(有效期30分钟),手机锁屏超30分钟以上。假如打开APP后同时发起五个请求,如何只确保刷新一次cookie,HarmonyOS中如何实现?okhttp请求拦截器代码(假如同时拦截到五次请求过期)。

async intercept(chain: Chain): Promise<Response> {
  let request = chain.requestI();
  let response = await chain.proceedI(request);
  if (!response.isSuccessful()) {
    // url重定向login,刷新cookie
    let time: number = systemDateTime.getTime(false)
    let timeDelay = time - ApiUtils.refreshCookieTime
    if (response.responseCode == HttpErrorCode.Forbidden) {
      let locationUrl = response.getHeadersEntry('location')
      if (locationUrl == ApiUtils.getXwebRequestUrl(Constant.webLogin)) {
        LogUtils.warn(API, `cookie timeout !!!, refreshSession, timeDelay : ${timeDelay}}`)
        let resp = await ApiUtils.refreshSession() as BaseResp<object>
        if (resp.code == HttpErrorCode.Success) {
          request.addHeader(ApiUtils.HEADER_COOKIE_KEY, ApiUtils.getCookie())
          LogUtils.info(API, '使用新cookie请求 : ' + request.getHeader(ApiUtils.HEADER_COOKIE_KEY))
          response = await chain.proceedI(request) // 重新发起请求
        }
      }
    }
  }
  response = await DecryptInterceptor.parseHttpResponse(chain, response)
  return response
}
/**
 * 刷新cookie
 * @param chain
 */
public static async refreshSession(): Promise<BaseResp<object>> {
  return new Promise((resolve: Function) => {
    let resp: BaseResp<object> = new BaseResp<object>()
    LogUtils.info(API, 'refreshSession start time : ' + systemDateTime.getTime(false))
    Api.getXWebService().refreshSession().then(response => {
      let faildMsg = ApiUtils.getFailMsg(response) as FaildMsg
      if (null != faildMsg) {
        LogUtils.warn(API, 'refreshSession faild : ' + faildMsg.getMsg())
        resp.code = HttpErrorCode.Fail
      } else {
        ApiUtils.refreshCookieTime = systemDateTime.getTime(false)
        LogUtils.info(API, 'refreshSession success, time : ' + ApiUtils.refreshCookieTime)
      }
      resolve(resp)
    }).catch(
      (error: Error) => {
        LogUtils.error(API, 'refreshSession error : ' + error.message)
        resp.code = HttpErrorCode.Fail
        resolve(resp)
      }
    )
  })
}
HarmonyOS
3天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

可以参考仓颉编程语言的同步机制中的synchronized关键字,搭配ReentrantMutex一起使用来实现该功能,详细使用方法如下:https://developer.huawei.com/consumer/cn/doc/cangjie-guides-V5/sync-V5#可重入互斥锁-reentrantmutex

关于获取仓颉sdk和如何使用,可以参考以下链接:

https://developer.huawei.com/consumer/cn/activityDetail/cangjie-beta/

分享
微博
QQ
微信
回复
3天前
相关问题
HarmonyOS 如何进行代码检查
142浏览 • 1回复 待解决
HarmonyOS 如何进行音频合成
397浏览 • 1回复 待解决
HarmonyOS 如何进行sdk升级
25浏览 • 1回复 待解决
HarmonyOS 如何进行邀请测试
25浏览 • 1回复 待解决
HarmonyOS如何进行模拟定位?
33浏览 • 1回复 待解决
HarmonyOS HAP之间如何进行通信?
481浏览 • 1回复 待解决
HarmonyOS 如何进行DES加解密
602浏览 • 1回复 待解决
如何进行系统崩溃监控?
750浏览 • 1回复 待解决
HarmonyOS 如何进行数据持久化
394浏览 • 1回复 待解决
如何进行页面横竖屏切换
2008浏览 • 1回复 待解决
页面横竖屏如何进行切换
475浏览 • 1回复 待解决
鸿蒙Js如何进行信息存储!
3334浏览 • 1回复 待解决
多个Cookie如何进行批量设置
2095浏览 • 1回复 待解决
HarmonyOS如何进行数据文件存储
452浏览 • 1回复 待解决
HarmonyOS 如何进行全局初始化操作
44浏览 • 1回复 待解决
HarmonyOS如何进行跨module的页面跳转
569浏览 • 1回复 待解决
$r中的资源如何进行比较
1864浏览 • 1回复 待解决