1.业务描述
通过微信支付开通vip,判断信息更新后再跳转
2.产生问题
通过setTimeout
进行间隔一秒发送请求,数据比较,成功更新后通过wx.navigateTo
跳转,此时setTimeout依然在后台持续调用
3.解决思路
setTimeout在每次调用后将生成一个标识符,而且每次都不同,所以用一个数组来保存起来,同时在页面离开时候清除所有的定时器
4.代码
data: { oldVal: '', timeList: [] }, onLoad: function(options) { this.pay() }, // 点击左上角返回箭头时候触发 onUnload: function(options) { for (let i = 0; i < this.data.timeList.length; i++) { clearTimeout(this.data.timeList[i]) } }, // 点击系统Home键返回上一步时候触发 onHide: function(options) { for (let i = 0; i < this.data.timeList.length; i++) { clearTimeout(this.data.timeList[i]) } }, checkIsUpdate: function () { wx.showLoading({ title: '请稍候' }) ajax((res)=>{ let oldVal = this.data.oldVal let newVal = res.newVal let time = setTimeout(()=>{ if (oldVal == newVal) { this.checkIsUpdate() } else { wx.hideLoading() wx.switchTab({ url: '../my/my' }) } }, 1000) this.data.timeList.push(time) }) }, pay: function () { let that = this payCallBack((res)=>{ wx.showToast({ title: '微信充值成功', icon: 'none', duration: 2000 }) that.checkIsUpdate() }) },
5.后记
在更新支付状态的时候可能发生用户离开当前页面,此时就需要清除计数器,否则,悬浮的模态框会在所有页面出现
用户离开页面包括两种动作,点击左上角的返回按钮,或者点击手机home键返回,这两种情况需要分别处理
6.其它方案
以上方案之所以要把所有延时句柄保存起来是因为,无法确定当前正在进入延时队列中的是具体的那个一,无法定点清除,所以就粗暴的将所有都保存起来,全部清除
后面经过思考,其实这里可以设置一个变量作为一个flag开关,在调用setTimeout
时候先判断flag的值,在页面离开时候重置flag的值