• 微信号:wumiao_357234902

防重复请求方法总结 wx.request-微信小程序

作者:Miao 阅读:2034次

微信小程序中,为了防止 wx.request 的重复请求,可以通过以下几种方式来实现:

1.使用 wx.showLoading 和 wx.hideLoading

在请求中,使用 wx.showLoading 显示加载动画,请求完成后使用 wx.hideLoading 隐藏加载动画。

function request(url, data, method = 'GET') {
    // 如果正在请求,显示加载提示
    wx.showLoading({
        title: '加载中...', // 提示内容
        mask: true, // 是否显示透明蒙层,防止触摸穿透
    });
    wx.request({
        url: url,
        data: data,
        method: method,
        success(res) {
            // 处理成功回调
            console.log('请求成功', res);
        },
        fail(err) {
            // 处理失败回调
            console.error('请求失败', err);
        },
        complete() {
            // 无论成功或失败,请求完成后隐藏加载提示并重置标志位
            wx.hideLoading();
        }
    });
}


2.使用标志位控制请求

可以通过设置一个标志位来标记当前是否有请求正在进行,从而防止重复请求。

let isRequesting = false;
function request(url, data, method = 'GET') {
    if (isRequesting) {
        console.log('请求正在进行中,请稍后再试');
        return;
    }
    isRequesting = true;
    wx.request({
        url: url,
        data: data,
        method: method,
        success(res) {
            // 处理成功回调
            console.log('请求成功', res);
        },
        fail(err) {
            // 处理失败回调
            console.error('请求失败', err);
        },
        complete() {
            // 无论成功或失败,请求完成后重置标志位
            isRequesting = false;
        }
    });
}


3.使用 Promise 封装请求

通过 Promise 封装 wx.request,并在请求前检查是否有未完成的请求。

let pendingRequest = null;
function request(url, data, method = 'GET') {
    if (pendingRequest) {
        console.log('请求正在进行中,请稍后再试');
        return Promise.reject('请求正在进行中');
    }
    pendingRequest = new Promise((resolve, reject) => {
        wx.request({
            url: url,
            data: data,
            method: method,
            success(res) {
                resolve(res);
            },
            fail(err) {
                reject(err);
            },
            complete() {
                pendingRequest = null;
            }
        });
    });
    return pendingRequest;
}


4.使用防抖函数

如果你希望在一定时间内只允许一次请求,可以使用防抖函数来控制请求的频率。

function debounceRequest(url, data, method = 'GET', delay = 1000) {
    let timer = null;
    return function () {
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(() => {
            wx.request({
                url: url,
                data: data,
                method: method,
                success(res) {
                    console.log('请求成功', res);
                },
                fail(err) {
                    console.error('请求失败', err);
                }
            });
        }, delay);
    };
}
// 使用示例
const debouncedRequest = debounceRequest('https://example.com/api', {
    key: 'value'
}, 'GET');
debouncedRequest();


5.使用队列控制请求

如果你希望按顺序处理请求,可以使用队列来控制请求的顺序。

let requestQueue = [];
let isProcessing = false;

function processQueue() {
    if (isProcessing || requestQueue.length === 0) {
        return;
    }
    isProcessing = true;
    const {
        url,
        data,
        method,
        resolve,
        reject
    } = requestQueue.shift();
    wx.request({
        url: url,
        data: data,
        method: method,
        success(res) {
            resolve(res);
        },
        fail(err) {
            reject(err);
        },
        complete() {
            isProcessing = false;
            processQueue();
        }
    });
}

function request(url, data, method = 'GET') {
    return new Promise((resolve, reject) => {
        requestQueue.push({
            url,
            data,
            method,
            resolve,
            reject
        });
        processQueue();
    });
}

本站部分文章、数据、素材收集于网络,所有版权均归源网站或原作者所有!

如果侵犯了您的权益,请来信告知我们下线删除,邮箱:357234902@qq.com