uni-app中手机出现uni.request发起一次请求但出去多次请求的情况

发布于 1周前 作者 phonegap100 来自 Uni-App

uni-app中手机出现uni.request发起一次请求但出去多次请求的情况

示例代码:

就是正常的 项目是vue3的哈
uni.request 请求


## 操作步骤:


uni.request 请求 项目是vue3的哈

预期结果:

预期只发起一次请求


## 实际结果:


很多接口都出现了点击一次发送多次的情况,偶尔又正常只发送一次

bug描述:

有手机出现情况,发送一次请求,但是自动发送多次的情况

看后端的日志,收到的请求

手机是
型号名称
华为畅享 50 Pro
型号代码
CTR-ALO0
HarmonyOS 版本
4.2.0
序列号
HXKYD22B01001604
867256063088603867256063185805
IMEI
MEID
A00000C3BEB21F
处理器
高通骁龙680
运行内存
8.0 GB + 3.0 GB>
可用空间:31.16GB
存储
总容量:256 GB
屏幕
2388 x1080


![Image](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20241025/b41e559c42d02a351c81bb61e091301b.png)

5 回复

信息有限,不确定业务逻辑怎么写的,如果是规律性的两次请求,打开 vue 调试工具断点看看,自己本地起一个 node 服务,请求本地的接口看看日志。有时候预检请求 options 在某些工具里会识别有误,也检查试试。


偶然性的,目前又遇到一次这类情况了,我先自己测试哈什么情况吧

顺便提一下我热更新之前,没有出现这个情况,是我热更新之后才有的,代码上面其实就是某小米手机出现uni.showToast不隐藏的情况,加了个主动隐藏。其它的就没动什么了。

是否是因为热更新打包会出现问题的情况

在uni-app开发中,如果遇到uni.request发起一次请求但实际上发出多次请求的情况,这通常是由于代码逻辑或事件绑定处理不当引起的。以下是一些常见的场景和对应的代码案例,帮助你排查和解决这个问题。

场景一:事件绑定导致多次请求

如果你在某个事件处理函数中发起请求,并且该事件被多次绑定,那么每次触发事件时都会发起多次请求。

错误示例

Page({
    onLoad() {
        this.setData({
            btnText: 'Click Me'
        });
        // 错误:每次页面加载都会重新绑定点击事件
        this.button.bindtap(this.handleClick);
    },
    handleClick() {
        uni.request({
            url: 'https://api.example.com/data',
            success: (res) => {
                console.log(res.data);
            }
        });
    }
});

修正示例: 确保事件只绑定一次,可以在页面的onLoadonReady生命周期中绑定。

Page({
    onLoad() {
        this.setData({
            btnText: 'Click Me'
        });
        // 正确:只在onLoad中绑定一次点击事件
        this.button.addEventListener('tap', this.handleClick.bind(this));
    },
    onClick() {
        uni.request({
            url: 'https://api.example.com/data',
            success: (res) => {
                console.log(res.data);
            }
        });
    },
    onUnload() {
        // 页面卸载时移除事件监听器,避免内存泄漏
        this.button.removeEventListener('tap', this.handleClick.bind(this));
    }
});

注意:uni-app中通常使用bindtap@tap在wxml中绑定事件,上述示例为通用JavaScript事件绑定方式,uni-app中应直接在wxml中绑定。

场景二:循环或条件语句导致多次请求

如果请求调用被包裹在循环或条件语句中,并且这些语句在请求发起前后可能被多次执行,也会导致多次请求。

错误示例

for (let i = 0; i < someCondition; i++) {
    uni.request({
        url: `https://api.example.com/data?id=${i}`,
        success: (res) => {
            console.log(res.data);
        }
    });
}

修正示例: 确保循环或条件语句的逻辑正确,避免不必要的重复请求。

if (someCondition) {
    uni.request({
        url: 'https://api.example.com/data',
        success: (res) => {
            console.log(res.data);
        }
    });
}

总之,解决uni.request发起多次请求的问题,关键在于审查代码中的事件绑定、循环和条件语句,确保请求只在需要时发起一次。如果问题依旧存在,可以进一步使用调试工具或日志输出来跟踪请求的具体触发情况。

回到顶部