前端,微信小程序

小程序onLaunch异步与onLoad同步解决方案


本来按照事件顺序,小程序初始化时触发App里的onLaunch,后面再执行页面Page里的onLoad,但是在onLaunch里请求获取是否有权限,等待返回值的时候Page里的onLoad事件就已经执行了。

解决方法:

这里采用的方法是定义一个回调函数
Page页面判断一下当前app.globalData.key是否有值,如果没有(第一次)则定义定义一个app方法(回调函数)app.keyCallback()。app页面在请求success后判断时候有Page页面定义的回调方法,如果有就执行该方法。因为回调函数是在Page里面定义的所以方法作用域this是指向Page页面。

app.js

//接口授权
        let res = Api(this.data.urlTop + 'accredit?secretKey=' + this.data.secretKey + '&userId=' + this.globalData.userId, 'get');
        res.then((resolve, reject) => {
            if (resolve.code !== -1) {
                this.globalData.key = resolve.data.key
                // 由于 Api 是网络请求,可能会在 Page.onLoad 之后才返回
                // 所以此处加入 callback 以防止这种情况
                if (this.keyCallback) {
                    this.keyCallback(resolve.data.key)
                }
            } else {
                console.log(reject)
            }
        })

Page下的index.js

//判断key
        if (app.globalData.key && app.globalData.key !== '') {
            funcs.get_ranking_list(this);
        } else {
            //调用app的keyCallback属性
            app.keyCallback = key => {
                //判断key
                if (key !== '') {
                    funcs.get_ranking_list(this);
                }
            }
        }

        //定义页面方法集合
        let funcs = {
            get_ranking_list(event) {
                let res = Api(app.globalData.urlApi + 'get-ranking-list?userId=' + app.globalData.userId + '&key=' + app.globalData.key, 'get');
                res.then((resolve, reject) => {
                    if (resolve.code !== -1) {
                        event.setData({
                            seniority: resolve.data
                        })
                        console.log(event.data.seniority)
                    } else {
                        console.log(reject)
                    }
                })
            }

        }

回复

This is just a placeholder img.