Taro开发小程序无感知登录

作者:陈佳鑫
时间:2022-10-24

使用 taro 开发微信小程序实现登录过期,无感知自动登录

let isRefreshing = true
let subscribers = []
const onAccessTokenFetched = () => {
  subscribers.forEach((callback) => {
    callback()
  })
  subscribers = []
}

const addSubscriber = (callback) => {
  subscribers.push(callback)
}

export class Http {
  constructor() {}
  request({ url, data = {}, method, header, callback = '' } = {}) {
    let _this = this
    return new Promise((resolve, reject) => {
      wx.request({
        url,
        data,
        method,
        header: { Authorization: 'Bearer ' + storge.get(LOGIN_TOKEN) },
        callback,
        fail(res) {
          reject(res)
        },
        complete: (res) => {
          if (callback) return callback(res.data)
          let statusCode = res.statusCode
          if (statusCode == 404) {
            console.log('接口不存在')
          } else if (statusCode == 401) {
            // 将须要从新执行的接口缓存到一个队列中
            addSubscriber(() => {
              _this.request({ url, data, method, header, callback: resolve })
            })
            if (isRefreshing) {
              getNewToken(url, data).then(() => {
                // 顺次去执行缓存的接口
                onAccessTokenFetched()
                isRefreshing = true
              })
            }
            isRefreshing = false
          } else if (statusCode == 200) {
            resolve(res.data)
          } else if (statusCode.startsWith('5')) {
            wx.showModal({ content: '服务器报错,请重试!', showCancel: false })
          }
        }
      })
    })
  }
}
// 获取token
const getNewToken = () => {
  return new Promise((resolve, reject) => {
    wx.login({
      success(res) {
        wx.request({
          url: '获取最新token接口地址',
          method: 'POST',
          success(res) {
            let r = res.data
            // 将所有存储到观察者数组中的申请从新执行。
            if (r.code == 0) {
              const token = r['data']['token']
              wx.setStorageSyn('LOGIN_TOKEN', token)
              resolve(res)
            }
          }
        })
      },
      fail(err) {
        reject()
        console.error('wx login fail', err)
      }
    })
  })
}
Last Updated:
Contributors: 1102166242@qq.com, cjx