收藏
回答

关于app实例的问题

问题模块 框架类型 问题类型 操作系统 操作系统版本 手机型号 微信版本
客户端 小程序 Bug Android 安卓6.0 华为MT7-CL00 6.6.6

    在真机测试我们小程序的过程中发现一个奇怪的问题,就是登录时将用户 token 存储在 app 实例的 globalData 下,在请求业务接口的时候再取 token 放在请求头里带到后台获取数据,然后有很小的概率获取不到 app 实例下的数据,不但 app 下的数据没有,而且 wx.getStorageSync 方法也获取不到东西。几率大概是五十分之一这样,貌似在网速不稳定的时候出现几率更高,在开发工具没有出现过这种情况。


    我本身不是做前台的,小程序代码是个女同事写的,我看了也没发现什么逻辑问题,只是有点乱,以下是按钮事件句柄:

tabSelect: function (e) {
    var that = this;
    var num = e.currentTarget.dataset.tabnum;
    that.setData({
      tabnum: num
    })
    pos = 0;
    that.setData({
      groupList: [],
      searchLoading: true, //"上拉加载"的变量,默认true,隐藏 
      searchLoadingComplete: false  //“没有数据”的变量,默认false,隐藏 
    })
    loadMore(that);
  }

    然后请求的 loadMore 方法:

var loadMore = function (that) {
  if (!that.data.busy) {
    that.setData({
      busy: true
    })
    wx.request({
      url: util.getUrl() + 'api/v1/groupPurchase/getListByState',
      method: 'POST',
      data: {
        state: that.data.tabnum,
        city_code: wx.getStorageSync('cityCode'),
        perPageNum: perPageNum,
        pos: pos
      },
      header: {
        'content-type': 'application/json',
        'Authorization': app.globalData.tokenStr
      },
      success: function (res) {
        that.setData({
          busy: false
        })
        var data = res.data;
        if (data.ret == 0) {

          // 请求成功处理

          // ...

        } else {
          wx.showModal({
            content: data.msg,
            showCancel: false,
            confirmText: "确定"
          })
        }
      },
      complete: function () {
        // complete
        wx.stopPullDownRefresh() //停止下拉刷新
      }
    })
  }
}



    情况是这样,在没有重新加载页面的情况下,分别点击两个绑定了同一个事件 tabSelect 的按钮,第一个按钮请求成功的,传到后台的数据都正常。在相隔数秒后点击第二个按钮,就获取不到 app.globalData.tokenStr 和缓存下的 cityCode 。以下是日志截图:

    点击第一个按钮:


    点击第二个按钮:

    


    相隔的时间不到 10 秒,我不清楚这个问题产生的原因,因为产生这个问题的概率很小,而且无法稳定的重现,我对小程序也不是很熟悉,所以想到社区来请教,有哪位朋友遇到过类似的问题或者有什么解决的方向么?望不吝赐教,谢谢。

    还有一点就是这个问题不止出现在这个页面,如果测试的次数够多的话相信在所有用到 token 的页面都会出现。

最后一次编辑于  2018-05-19  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

8 个回答

  • 莫过于此
    莫过于此
    2018-05-19

    你的token是在app.js中请求的吗?

    2018-05-19
    赞同
    回复 1
    • xiaoqiang
      xiaoqiang
      2018-06-14

      是的,我另外写了一个专门用于存取缓存的方法,问题已经改善很多了。估计是缓存命中问题

      2018-06-14
      赞同
      回复
  • xiaoqiang
    xiaoqiang
    2018-05-19

    对,token 是在app.js 里获得并设置到 app.globalData 里的。由于 getUserinfo 接口的调整还做了一个用户登录页,也是可能是在登录页获得的 token 。上面问题里说的情况 token 是肯定已经设置了的,否则第一次点击按钮不会有token 数据的

    2018-05-19
    赞同
    回复
  • 你倒是跳啊
    你倒是跳啊
    2018-05-22

    你可以在请求前面加上条件判断或者try/catch代码块来输出查看一下获取的缓存或者全局变量的值

    2018-05-22
    赞同
    回复 1
    • xiaoqiang
      xiaoqiang
      2018-05-22
      目前来看只能这样了,但是这个检查其实毫无道理,特别是全局变量的检查,我是无法想象定义好的东西,在用它的时候还要再检查一遍。还有缓存的命中也是大问题
      2018-05-22
      赞同
      回复
  • helen.min
    helen.min
    2018-06-14

    请问解决了吗?我也碰到这个问题了

    2018-06-14
    赞同
    回复 1
    • xiaoqiang
      xiaoqiang
      2018-06-27

      我认为是缓存命中引起的,在操作缓存时捕获异常,我手工写了两个方法

      function getStorageByKey(key){
        var ok = false;
        var val = null;
        while (!ok){
          try {
            val = wx.getStorageSync(key);
            ok = true;
          } catch (e) {
       
          }
        }
        return val;
      }
       
      function setStorage(key,value){
        var ok = false;
        while(!ok){
          try {
            wx.setStorageSync(key, value);
            ok = true;
          } catch (e) {
          }
        }
      }

      这样处理后改善了很多,但是在真机内存耗尽的情况下仍然有可能出现这种情况。

      2018-06-27
      赞同
      回复
  • 露露
    露露
    2018-10-29

    问题是如何解决的,我也碰到同样的问题

    2018-10-29
    赞同
    回复