123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- import {
- requestConfig
- } from '@/app.config.js'
- let isRefreshing = true // 是否正在刷新的标记
- let subscribers = []; // 缓存
- function onAccessTokenFetched() {
- // 更新个人中心的数据
- uni.$emit("userinfoRefresh", true)
- subscribers.forEach((callback) => {
- callback()
- })
- subscribers = [];
- }
- function addSubscriber(callback) {
- subscribers.push(callback)
- }
- function checkStatus(param) {
- // 刷新token的函数,这需要添加一个开关,防止重复请求
- if (isRefreshing) {
- referToken()
- }
- isRefreshing = false;
- // 将token刷新成功后的回调请求缓存
- const retryOriginalRequest = new Promise((resolve) => {
- addSubscriber(() => {
- resolve(Request.prototype.http(param))
- })
- });
- return retryOriginalRequest;
- }
- // 无感刷新
- function referToken() {
- uni.removeStorageSync('token');
- api.login({
- grant_type: 'refresh',
- refresh_token: uni.getStorageSync('refresh_token'),
- client_type: 0,
- }).then(res => {
- if (res.code === 200) {
- uni.removeStorageSync('refresh_token');
- uni.setStorageSync("token", 'Bearer ' + res.data
- .access_token);
- uni.setStorageSync("refresh_token", res.data
- .refresh_token);
- //执行缓存中的请求
- onAccessTokenFetched()
- //延迟几秒再将刷新token的开关放开,不然偶尔还是会重复提交刷新token的请求
- setTimeout(() => {
- isRefreshing = true;
- }, 3000)
- }
- })
- }
- class Request {
- http(param) {
- let url = param.url,
- header = param.header,
- method = param.method,
- data = param.data,
- dataType = 'json',
- responseType = param.responseType || 'text'
- if (header) {
- header = param.header
- } else {
- header = {
- 'Content-type': "application/x-www-form-urlencoded",
- };
- }
- const token = uni.getStorageSync('token');
- header['token'] = header['token'] ? header['token'] : token ? token : '';
- // 返回promise
- return new Promise((resolve, reject) => {
- let baseUrl
- if (process.env.NODE_ENV === 'production') {
- baseUrl = requestConfig.prodBaseUrl
- } else {
- baseUrl = requestConfig.test ? requestConfig.testBaseUrl : requestConfig.devBaseUrl
- }
- // 请求
- uni.request({
- url: baseUrl + url,
- data: data,
- method: method,
- dataType: dataType,
- responseType: responseType,
- header: header,
- success: (res) => {
- if (res.statusCode && res.statusCode != 200) {
- uni.$u.toast("api错误" + res.data.error)
- return;
- }
- if (res.data.code !== 200) {
- // code判断:200成功,不等于200错误
- if (res.data.code == 501) {
- if (!uni.getStorageSync('refresh_token')) {
- webUni.webViewuni.reLaunch({
- url: "/pages/index/login/login",
- });
- }
- // 登录信息失效,静默登录
- checkStatus(param).then(res => {
- resolve(res)
- })
- } else {
- uni.$u.toast(res.data.msg)
- }
- }
- // 将结果抛出
- resolve(res.data)
- },
- //请求失败
- fail: (e) => {
- uni.$u.toast('网络异常, 请检查网络连接')
- resolve(e.data);
- },
- //请求完成
- complete() {
- resolve();
- return;
- },
- })
- })
- }
- }
- export default new Request()
|