不够完美但也很能打的

点击查看代码
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);
    })
}
posted @   jialiangzai  阅读(19)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)

喜欢请打赏

扫描二维码打赏

微信打赏

点击右上角即可分享
微信分享提示