• 微信/头条小程序如何确保异步请求执行完后再执行各页面的onLoad方法


    微信/头条小程序如何确保异步请求执行完后再执行各页面的onLoad方法

    在开发的过程中,由于小程序生命周期的执行顺序是不可暂停的,以登录权限为例:
    当进入小程序时首先执行app.js的onLaunch--onShow方式后再执行b页面的onLoad方法,b页面需要弹出提示登录的弹窗,当服务器返回需要一定时间或网络较差时,此时小程序已经执行了b页面的方法,导致在登录接口还没有返回前就已经在b页面判断了权限。

    app.js

    onLaunch() {
        loginByCode().then(resolve => {
            //do something
        });
    }
    loginByCode() {
        return new Promise(resolve => {
            wx.request({
                url: 'https://xxx.com',
                method: 'GET',
                data: {},
                success: ({
                    data,
                    statusCode,
                    header
                }) => {
                    //接口返回结果后将登录状态置为true
                    app.globalData.loginPermissions = true;
                    resolve();
                }
            }) 
        });
    }
    

    这里我们在小程序冷启动时onLaunch中做了个简单的异步请求。

    页面b.js

    onLoad() {
        //当进入此页面时,需要判断是否已登录用户,如果没有登录需要弹出登录弹窗
        if(!app.globalData.loginPermissions) {
            this.loginPopup.open();
        }else {
            //do something
        }
    }
    

    假如按照以上方式处理,会导致loginByCode登录接口返回缓慢时,进入b页面后,即使用户已经是登录的状态,但依然会弹出登录窗口。

    对于上述问题,我们来改进一下代码

    app.js

    onLaunch() {
        loginByCode().then(resolve => {
            if (this.loginCallBack) {
                //这里的this 是指当前页面的this
                this.loginCallBack();
            }
        });
    }
    loginByCode() {
        return new Promise(resolve => {
            wx.request({
                url: 'https://xxx.com',
                method: 'GET',
                data: {},
                success: ({
                    data,
                    statusCode,
                    header
                }) => {
                    //接口返回结果后将登录状态置为true
                    app.globalData.loginPermissions = true;
                    resolve();
                }
            }) 
        });
    }
    

    页面b.js

    onLoad() {
        //当进入此页面时,需要判断是否已登录用户,如果没有登录需要弹出登录弹窗
        if(app.globalData.loginPermissions && app.globalData.loginPermissions != '') {
          //do something
        }else {
          app.loginCallBack = () => {
            if (!app.globalData.loginPermissions) this.loginPopup.open();
            else this.loginPopup.close();
          }
        }
    }
    
  • 相关阅读:
    JavaScript的for循环编写九九乘法表
    Python核心编程(切片索引的更多内容)
    js/jq宽高的理解与运用
    七月与安生:不管选择哪条路,都会是辛苦的 — —豆瓣老丑
    Linux命令入门
    jq滚动监听-导航滚动
    jQuery页面滚动监听事件及高级效果插件
    跟随鼠标移动展示内容
    用相对定位和负向移动完成图片相框阴影
    腾讯数据总监:运营人员必须掌握的APP基础数据分析体系(没有比这篇更系统全面的)
  • 原文地址:https://www.cnblogs.com/xiechuanghong/p/14113350.html
Copyright © 2020-2023  润新知