uniapp 前端定时刷新token,接口排队等待,promise 接口封装

一、需求

       此项目为小程序。小程序完成第一版token刷新设计思路是:根据接口调用返回的errorCode来判断当前用户的token和refreshToken是否过期。根据不同的errorCode,前端去调用接口完成token的刷新或者跳转到登录页面重新登录。

       由于小程序的用户功能权限可以在后台管理系统中配置,但是小程序的用户权限变化后,没有办法通知到小程序去更新token或者提示用户重新登录。所以跟后端配合,需要前端增加一个定时调用刷新token接口的需求。比如:后端设置的token是10h过期,那前端就可以每隔5h去调用刷新接口去更新token。新的token接口会返回当前用户最新的权限。从而实现用户功能权限的更新。

二、实现思路

 1、第一版代码(未增加定时刷新功能)接口封装如下

// 封装请求
const request = function(url, params) {
  if (!url) {
    console.log('请传入url......')
    return
  }
  return new Promise((resolve, reject) => {
    // to do
    // 接口调用前 参数params封装

    // 调用uniapp 请求接口
    uni.request({
      url: basePath + url, // 仅为示例,并非真实接口地址。
      data: params.data,
      header: {
        'token': store.getters.getToken,
        'content-type': params.contentType || 'application/x-www-form-urlencoded',
        'refreshToken': store.getters.getRefreshToken,
      },
      method: params.method || 'POST',
    }).then((uniData) => {
      // uniData为一个数组
      // 数组第一项为错误信息 即为 fail 回调
      // 第二项为返回数据
      const [err, uniRes] = uniData;
      if (err) {
        console.log('uni err-------------------:', err)
        uni.showToast({
          icon: 'none',
          title: '服务异常,请稍后重试!'
        })
        return
      }
      const res = uniRes.data || {}
      
      if (res.success) {
        let resultData = res.data || {}
        resolve(resultData)
      } else {
        const code = res.code
        // to do
        // 根据code处理异常

        reject()
      }
    })
  })
}

2. 实现定时刷新思路

  2.1、记录用户信息刷新的时间(使用的时间戳),存vuex:timeOfUserInfo

在一切重新获取了用户权限信息(一定是token变更了)的接口处,记录当前的时间(记录的是用户本地的时间,也是用用户本地的时间去计算的时间差,当本地时间有误的时候,可能会出现接口没有调用的问题)。

  2.2、判断是否调用refresh接口

接口A调用时,根据当前时间与timeOfUserInfo时间差,【1】如果超过3h,则先去调用refresh接口,同时挂起接口A.【2】如果没有超过3h,则直接调用

这里面存在2个问题



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值