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