伊呀程序
伊呀程序
  • 发布:2020-03-26 14:45
  • 更新:2021-06-03 16:30
  • 阅读:10616

uni.showToast、 uni.showLoading()、 uni.hideLoading() 冲突问题

分类:uni-app

项目之前使用的在request请求时设置加载中动画,请求结束后弹出执行结果提示,关闭加载动画。代码示例如下:

    uni.showLoading({  
        title:'正在提交...'  
    });  
    let data = JSON.parse(JSON.stringify($this.sendData));  
    const r = instance.post({  
        url : url,  
        data: data  
    })  
    .then(res => {  
        console.log(res)  
        uni.showToast({ title: '提交成功', icon: "none", position:'bottom'});  
    })  
    .catch(err => {  
        uni.showToast({ title: '提交失败', icon: "none", position:'bottom'});  
    })  
    .finally(() => {  
        uni.hideLoading();  
        console.log('finally')  
    });

这样执行请求成功与失败的提示无法显示,就是因为finally中使用了uni.hideLoading(); 。更离奇的是调用 uni.showToast 居然会把showLoading给关闭了,官方也没个解释啥的,就因为这个提示问题折腾了好久,之前一直以为是请求数据问题,没想到搞半天问题在这!这到底是BUG,以后会修复?还是说这不是BUG,以后都不会修复?希望官方给个准信,另外如果不算BUG,不会修复,还请官方尽早更新一下相关文档,免得大家浪费时间折腾来折腾去的找问题。

2020-03-26 14:45 负责人:无 分享
已邀请:
左右摇摆

左右摇摆

你把finally 里面的uni.hideLoading();拿出来呢,分别放到 then 和 catch 里面。我没用过finally

  • 伊呀程序 (作者)

    拿出来只要放在uni.showToast之前,是可以的,还有一个奇葩问题,如果uni.showToast后面有uni.showLoading,showToast内容一样不会显示。我也是服了这玩意儿了

    2020-03-26 18:51

DCloud_UNI_GSQ

DCloud_UNI_GSQ

showToast 和 showLoading 是底层同一个(按的小程序的设计),所以 .showToast 和 showLoading 会相互覆盖,而 hideLoading 也会关闭 showToast 。
冲突解决方案:
App:使用 plus.nativeUI.toast 接口
非App:其中一个使用自定义组件实现。

另外 2.8.0+ 已优化

  • 8***@qq.com

    而且,而且还有个坑,showLoading是个异步,用它封装请求方法时,当有多个请求并行时,很有可能有一个菊花永远留在页面上了。。。

    无奈只能延时。。

    2020-03-30 16:58

  • DCloud_UNI_GSQ

    回复 8***@qq.com: Promise.all

    2020-03-30 17:00

  • 8***@qq.com

    回复 DCloud_UNI_GSQ: 意思只能又把Promise.all再封装一遍咯。。

    另外还有个问题https://ask.dcloud.net.cn/question/91254新版并没有得到解决,希望看一下。

    2020-03-30 17:03

  • DCloud_UNI_GSQ

    回复 8***@qq.com: 啥又封一遍,并发请求一遍不都用promise.all吗?没有promise之前都是自己计数

    2020-03-30 17:37

  • 8***@qq.com

    回复 DCloud_UNI_GSQ: 我的意思,封装的单个promise带有菊花,使用promise.all传入这些promise时就不对了啊,怎么样不修改每个页面代码做到

    2020-03-30 17:41

  • DCloud_UNI_GSQ

    回复 8***@qq.com: 你菊花写在request封装外,或者你在封装的request内进行计数都可以

    2020-03-30 18:01

  • 8***@qq.com

    回复 DCloud_UNI_GSQ: 感觉最保险的还是在每个页面调用的时候分单个或者多个写菊花代码,但是改动太多了放弃了。计数等各种试过了,loading时候和hide时候,但关键是因为loading是个异步方法,调用->回调->显示这三个时间点,多个请求和时间速度各种因素下,不能保证最后一个hide调用一定在最后一个菊花显示到界面之前。

    2020-03-30 18:18

  • 8***@qq.com

    回复 DCloud_UNI_GSQ: 另外建议输入相关体验方面可以优化回复 840261937@qq.com: 是之后,不能保证最后一个hide调用一定在最后一个菊花显示到界面之后

    2020-03-30 18:20

  • 8***@qq.com

    厉害了 老哥 解决了 就是感觉 怪怪的 算了 能解决冲突就行

    2020-06-24 16:47

y***@163.com

y***@163.com

因为finally 是靠后执行的,所以showToast 之后立即执行了hideLoading ,同一个底层的原因导致提示显示,你可以试试让showToast延后执行,很简单,套一个setTimeout即可,时间给0就行了

冰冷de夏天

冰冷de夏天

我就用了一个loading,没用toast,还是直接给我关了,我都蒙蔽

  • DCloud_UNI_GSQ

    版本多少?

    2021-06-03 16:31

  • 2***@qq.com

    我也是,只用了loading,没写hideloading,直接就一闪而过,自己关了

    2021-07-19 10:28

该问题目前已经被锁定, 无法添加新回复