不够完美但也很能打的
点击查看代码
const baseUrl = 'https://wxyd.jckkan.com/index.php' //生产用
let retryCount = 1;
const maxRetry = 2; // 最大重试次数,比如设置为3
let isRefreshing = false
let requestsQueue = []
// 刷新token的函数
function refreshToken(requestUrl, method, requestData, requestHeader, resolve, reject, isPolling, callback) {
// 这里需要实现刷新token的逻辑,并在成功后执行callback
// 示例代码,具体实现需要根据实际情况调整
const app = getApp();
if (retryCount < maxRetry) {
isRefreshing = true; // 设置刷新锁
uni.login({
provider: 'toutiao', //使用微信登录
success: async (loginRes) => {
let visitorFan = await app.globalData.api.index
.getList({
bodyData: {
m: 'Api',
c: 'Public',
a: 'platformLogin',
mchid: 1,
clickid: app.globalData.clickid || ''
},
data: {
anonymous_code: loginRes.anonymousCode,
code: loginRes.code
}
})
if (visitorFan.data.code === 1) {
retryCount++; // 增加重试计数
isRefreshing = false;
let newToken = visitorFan.data.data.cookie
//全局存储用户信息
app.globalData.token = newToken
app.globalData.info = visitorFan.data.data
requestHeader['cookie'] = newToken; // 更新请求头部的token
uni.setStorageSync('yjtoken', newToken)
uni.setStorageSync('visitorInfo', visitorFan.data.data)
uni.setStorageSync('info', visitorFan.data.data)
if (callback) {
callback()
} else {
requestsQueue.forEach((queuedRequest) => {
sendRequest(queuedRequest.requestUrl, queuedRequest.method,
queuedRequest.requestData, requestHeader, queuedRequest
.resolve, queuedRequest.reject, queuedRequest.isPolling);
});
console.log('requestsQueue', requestsQueue)
requestsQueue = [];
}
} else {
// toast提示
uni.showToast({
title: visitorFan.data.msg
})
}
},
fail: () => {
reject({
message: '无法刷新token,请稍后再试'
});
}
})
} else {
retryCount = 0; // 重置重试计数
uni.showToast({
title: "多次尝试登录失败,请检查网络或联系支持",
icon: "none",
complete: () => {
reject({
message: '多次尝试登录失败,请检查网络或联系支持。'
});
}
});
// 这里可以添加提示用户重新登录的逻辑
}
}
function sendRequest(requestUrl, method, requestData, requestHeader, resolve, reject, isPolling) {
uni.request({
url: requestUrl,
method: method,
data: requestData,
header: requestHeader,
timeout: 5000,
success: (res) => {
if (res.statusCode === 200) {
// Assuming res.data is always an object when the status code is 200
switch (res.data.code) {
case 1: // Fall through
case 0:
resolve(res);
break;
case -1:
requestsQueue.push({
requestUrl,
method,
requestData,
requestHeader,
resolve,
reject,
isPolling
});
// () => {
// sendRequest(requestUrl, method, requestData, requestHeader, resolve,
// reject, isPolling);
// }
// console.log('requestsQueue', requestsQueue);
refreshToken(requestUrl, method, requestData, requestHeader, resolve, reject,
isPolling
);
break;
default:
// You could handle other codes here or reject
reject(new Error('Unknown code'));
break;
}
} else if (res.statusCode === 503) {
// let pagePreList = getCurrentPages();
// let pagePre = pagePreList[pagePreList.length - 1]['$page']['fullPath'];
// let options = pagePreList[pagePreList.length - 1]['options']
// let newOption = Object.entries(options)
// .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
// .join('&');
// let redictorUrlp = pagePre
// console.log('redictorUrlp', redictorUrlp);
uni.redirectTo({
url: `/pagesA/503/503`
})
reject(res);
} else {
uni.showToast({
title: '服务器繁忙,请稍后再试',
icon: 'none',
});
reject(res);
}
},
fail: async (error) => {
await uni.showModal({
title: '提示',
content: '网络连接超时,请稍后再试',
showCancel: false,
success: (res) => {
if (res.confirm) {
uni.reLaunch({
url: '/pages/index/index'
})
}
}
});
reject(error);
},
complete: () => {
if (!isPolling) {
uni.hideLoading({
fail: () => {},
complete: (hide) => {}
});
}
}
});
}
export default function request(url, {
data = {},
bodyData = false,
header = {},
}, type = 'get', isPolling) {
const app = getApp();
// 公共header 本地存有并且不是登录模块
let tokens = uni.getStorageSync('yjtoken')
header['cookie'] = tokens
// header['cookie'] = app.globalData.token || tokens
// console.log('请求数据', url, data, 'header', header)
// json数据同事传bodyData
let bodyUrl = '';
if (bodyData) {
for (let key in bodyData) {
bodyUrl += `${key}=${bodyData[key]}&`
}
}
const requestUrl = baseUrl + url + (bodyUrl ? '?' + bodyUrl : '');
const method = type.toUpperCase();
if (!isPolling) {
uni.showLoading({
title: "加载中",
mask: true
});
}
return new Promise((resolve, reject) => {
sendRequest(requestUrl, method, data, header, resolve, reject, isPolling);
})
}
本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/articles/18143648

浙公网安备 33010602011771号