收藏
回答

showloading 的使用问题

问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
API和组件 小程序 需求 showLoading 客户端 7.0 2.5.0

小程序 有很多个页面,

在访问服务器的时候 request接口防止 时间过长 ,加了 showloading , 在complete 里面调用hideLoading


由于页面跟服务器交互比较多 , loading条会一直频闪。 感觉体验不太好。


这块有没有好的解决方式?能实现 加载到最后一个才调用 hideLoading


-------------------------------------------------


如果放到每个页面,

一个是工作量确实很大, 大约有十几页;

另一个由于是异步处理的,这里面结束的顺序未必是先后顺序;

再有就是之后扩展起来比较麻烦。


这块高手能给个建议吗?是如何实现的?


最后一次编辑于  01-13  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

3 个回答

  • 抬头忘了谁
    抬头忘了谁
    01-14
    req1:function(){
    return new Promise(r => wx.request({ complete:r }))
    }
    ,req2:function(){
    return new Promise(r => wx.request({ complete:r }))
    },
    run(){
        wx.showLoading()
        Promise.all([this.req1, this.req2]).then(wx.hideLoading)
    }

    如果同时进行两个请求就在全部结束后执行hide。如果是同步先后请求,就在后者执行hide

    01-14
    赞同 1
    回复 7
    • Aleda
      Aleda
      01-14

      非常感谢!

      01-14
      回复
    • Aleda
      Aleda
      01-14

      你好 ,我再请求个问题, 我看了 Promise.all 接口,,如果其中一个失败了,那就直接返回失败的,

      那另外的请求成功的接口还会返回吗?

      01-14
      回复
    • Aleda
      Aleda
      01-14

      还一个问题 【麻烦您了】

      就是 我在app.js 里面,调用了 接口 登录获取token 还有一些数据之类的

      然后 在初始的页面里面的onload 判断如果有token 获取额外的一些数据[由于是不同的防守可能进入不同的页面,比如二维码,或者分享之类的]

      这样进入页面的时候 会有至少两次 loading, 这样能解决吗?


      01-14
      回复
    • 抬头忘了谁
      抬头忘了谁
      01-15回复Aleda

      complete是 接口调用结束的回调函数(调用成功、失败都会执行)所以无论成功失败都会进入then

      01-15
      回复
    • 抬头忘了谁
      抬头忘了谁
      01-15回复Aleda

      获取token不用show和hideLoading。因为token和页面元素没有直接关系,所以在页面onLoad时showLoading,业务接口完毕后hide就好。

      01-15
      回复
    查看更多(2)
  • 卢霄霄
    卢霄霄
    01-13

    每次showLoading计数+1,每次complete计数-1,归零的时候才hide

    01-13
    赞同 1
    回复 4
    • Aleda
      Aleda
      01-13

      谢谢

      我有个疑问, 那success 里面内容 执行的时候,是都返回了才 执行complete吗? 我不知道这个顺序。如果是这样就解决了。

      如果complete同时执行 可能还是之前的情况。 我试一下。。


      01-13
      回复
    • Aleda
      Aleda
      01-13

      刚刚测试了下, 执行顺序是这样的。

      我在 request 打印 1 , 在它的内部打印2, 也就是 执行完 success 立即先执行了complete, 然后内层嵌套的 success 和complete 是后执行的。

      那这样 计数可能就没作用了。


      01-13
      回复
    • 卢霄霄
      卢霄霄
      01-13回复Aleda

      在发起request之前就showLoading了噻

      count=0

      showLoading

      count++

      wx.request({

          success:()=>{

              count++

              wx.request({

                  success:()=>{

              

                  },

                  complete:()=>{

                      count--

                      if(count==0){

                          hideLoading

                      }

                  }

              })

          },

          complete:()=>{

              count--

              if(count==0){

                  hideLoading

              }

          }

      })

      你是说这么写有问题吗?

      01-13
      1
      回复
    • Aleda
      Aleda
      01-14回复卢霄霄

      非常感谢 !  昨天我想通了, 是调用之前已经加一了, 所以一直是1,最后是0。。


      01-14
      回复
  • Aleda
    Aleda
    01-13

    补充, 我一般是在 第一个request的success 里面 再次调用request.

    01-13
    赞同
    回复