微信/头条小程序如何确保异步请求执行完后再执行各页面的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();
      }
    }
}