关于app实例的问题

发布于 8 年前作者 gang1514414 次浏览最后编辑 8 年前来自 ask

    在真机测试我们小程序的过程中发现一个奇怪的问题,就是登录时将用户 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 的页面都会出现。

5 回复
yangyao
yangyao1 楼6 年前

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

juanma
juanma2 楼6 年前

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

aqian
aqian3 楼6 年前

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

kfang
kfang4 楼6 年前

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

swu
swu5 楼6 年前

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