iOS微信小程序在接口请求时,一直pending
首页 专栏 ios 文章详情
0

iOS微信小程序在接口请求时,一直pending

闫雪 发布于 1 月 20 日
简述:在使用uni-app开发微信小程序时,iOS手机在支付的时候,请求接口一直pending,安卓手机没问题,模拟器也没问题,只有iOS真机调试的时候有问题。

接口在其它页面可以正常请求,唯独在支付页面一直pending,不能正常走下面的流程。
image

因为安卓没事儿,所以应该不是服务器的问题,所以我就一直在找前端的问题。看到pending的上一个页面渲染的接口能正常请求,所以我先把上一个接口注释掉了,注释掉就好了。

当时觉得很奇怪,就追根溯源看看这个接口里面做了什么吧。里面有一个setInterval支付倒计时的定时器,猜测是不是定时器里面做的东西太多了,把进程跑满了,所以就卡在接口那了呢?

页面渲染的接口放开,把里面定时器的start注释试了一下,验证了我的想法,果然是定时器里面的代码的问题。

先前写的代码确实堪忧:

self.timer = setInterval(() => {
var today = new Date()//当前时间
var D,H,M,S;
var shenyu = this.stopTime.getTime()-today.getTime(),//倒计时毫秒数
shengyuD = parseInt(shenyu/(60*60*24*1000)),//转换为天
D = parseInt(shenyu)-parseInt(shengyuD*60*60*24*1000),//除去天的毫秒数
shengyuH = parseInt(D/(60*60*1000)),//除去天的毫秒数转换成小时
H = D-shengyuH*60*60*1000,//除去天、小时的毫秒数
shengyuM = parseInt(H/(60*1000)),//除去天的毫秒数转换成分钟
M = H-shengyuM*60*1000;//除去天、小时、分的毫秒数
S = parseInt((shenyu-shengyuD*60*60*24*1000-shengyuH*60*60*1000-shengyuM*60*1000)/1000)//除去天、小时、分的毫秒数转化为秒
if(shenyu>0){
    //赋值
    var timeText;
    if(shengyuM < 0 && S < 0){
        timeText = '00:00';
    }else{
        shengyuH = shengyuH<10 ? ('0'+shengyuH):shengyuH;
        shengyuM = shengyuM<10 ? ('0'+shengyuM):shengyuM;
        S = S<10 ? ('0'+S):S;
        timeText = shengyuH+':'+shengyuM+':'+S;
    }
    self.timeText = timeText;
}else{
    clearInterval(self.timer);
}
}, 1000);

1秒一获取当前时间 1秒一计算当前时间 。。咳咳...

简化后:

var today = new Date();//当前时间
var shenyu = this.stopTime.getTime()-today.getTime();//倒计时毫秒数
self.timer = setInterval(() => {
    //定义变量 d,h,m,s保存倒计时的时间
    var d,h,m,s;  
    if(shenyu>=0){
        d = Math.floor(shenyu/1000/60/60/24);
        h = Math.floor(shenyu/1000/60/60%24);  
        m = Math.floor(shenyu/1000/60%60);  
        s = Math.floor(shenyu/1000%60); 
        console.log(d+':'+h+':'+m+':'+s);
        //赋值
        var timeText;
        if(shenyu == 0){
            timeText = '00:00';
        }else{
            h = h<10 ? ('0'+h):h;
            m = m<10 ? ('0'+m):m;
            s = s<10 ? ('0'+s):s;
            timeText = h+':'+m+':'+s;
        }
        self.timeText = timeText;
    }else{
        timeText = '00:00';
        clearInterval(self.timer);
    }
    shenyu = shenyu-1000;
},1000);

(所以如果一直pending的话,可以试这看看,代码的是否可以优化来解决,具体问题具体分析)

以上是我调bug的经历,记录下来,希望有幸可以帮到你,比心。

ios 接口 bug修复 微信小程序
阅读 57 发布于 1 月 20 日
赞 收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
闫雪
专栏
关注专栏
avatar
闫雪
1 声望
4 粉丝
关注作者
0 条评论
得票 时间
提交评论
avatar
闫雪
1 声望
4 粉丝
关注作者
宣传栏
简述:在使用uni-app开发微信小程序时,iOS手机在支付的时候,请求接口一直pending,安卓手机没问题,模拟器也没问题,只有iOS真机调试的时候有问题。

接口在其它页面可以正常请求,唯独在支付页面一直pending,不能正常走下面的流程。
image

因为安卓没事儿,所以应该不是服务器的问题,所以我就一直在找前端的问题。看到pending的上一个页面渲染的接口能正常请求,所以我先把上一个接口注释掉了,注释掉就好了。

当时觉得很奇怪,就追根溯源看看这个接口里面做了什么吧。里面有一个setInterval支付倒计时的定时器,猜测是不是定时器里面做的东西太多了,把进程跑满了,所以就卡在接口那了呢?

页面渲染的接口放开,把里面定时器的start注释试了一下,验证了我的想法,果然是定时器里面的代码的问题。

先前写的代码确实堪忧:

self.timer = setInterval(() => {
var today = new Date()//当前时间
var D,H,M,S;
var shenyu = this.stopTime.getTime()-today.getTime(),//倒计时毫秒数
shengyuD = parseInt(shenyu/(60*60*24*1000)),//转换为天
D = parseInt(shenyu)-parseInt(shengyuD*60*60*24*1000),//除去天的毫秒数
shengyuH = parseInt(D/(60*60*1000)),//除去天的毫秒数转换成小时
H = D-shengyuH*60*60*1000,//除去天、小时的毫秒数
shengyuM = parseInt(H/(60*1000)),//除去天的毫秒数转换成分钟
M = H-shengyuM*60*1000;//除去天、小时、分的毫秒数
S = parseInt((shenyu-shengyuD*60*60*24*1000-shengyuH*60*60*1000-shengyuM*60*1000)/1000)//除去天、小时、分的毫秒数转化为秒
if(shenyu>0){
    //赋值
    var timeText;
    if(shengyuM < 0 && S < 0){
        timeText = '00:00';
    }else{
        shengyuH = shengyuH<10 ? ('0'+shengyuH):shengyuH;
        shengyuM = shengyuM<10 ? ('0'+shengyuM):shengyuM;
        S = S<10 ? ('0'+S):S;
        timeText = shengyuH+':'+shengyuM+':'+S;
    }
    self.timeText = timeText;
}else{
    clearInterval(self.timer);
}
}, 1000);

1秒一获取当前时间 1秒一计算当前时间 。。咳咳...

简化后:

var today = new Date();//当前时间
var shenyu = this.stopTime.getTime()-today.getTime();//倒计时毫秒数
self.timer = setInterval(() => {
    //定义变量 d,h,m,s保存倒计时的时间
    var d,h,m,s;  
    if(shenyu>=0){
        d = Math.floor(shenyu/1000/60/60/24);
        h = Math.floor(shenyu/1000/60/60%24);  
        m = Math.floor(shenyu/1000/60%60);  
        s = Math.floor(shenyu/1000%60); 
        console.log(d+':'+h+':'+m+':'+s);
        //赋值
        var timeText;
        if(shenyu == 0){
            timeText = '00:00';
        }else{
            h = h<10 ? ('0'+h):h;
            m = m<10 ? ('0'+m):m;
            s = s<10 ? ('0'+s):s;
            timeText = h+':'+m+':'+s;
        }
        self.timeText = timeText;
    }else{
        timeText = '00:00';
        clearInterval(self.timer);
    }
    shenyu = shenyu-1000;
},1000);

(所以如果一直pending的话,可以试这看看,代码的是否可以优化来解决,具体问题具体分析)

以上是我调bug的经历,记录下来,希望有幸可以帮到你,比心。