微信小程序页面onLoad获取app.js的onLaunch数据(异步获取用户信息)

微信小程序声明周期

小程序的生命周期,简单来说:就是app.js里的onLaunch和页面里的page.js的onLoad异步执行。

图解
通过回调函数架构起联系,便于获取app.js内的全局数据

代码

app.js
//app.js
App({
  onLaunch: async function () {
    let openid = null;

    if (!wx.cloud) {
      console.error('[app.js] [onLaunch] 请使用 2.2.3 或以上的基础库以使用云能力')
    } else {
      wx.cloud.init({
        // env 参数说明:
        //   env 参数决定接下来小程序发起的云开发调用(wx.cloud.xxx)会默认请求到哪个云环境的资源
        //   此处请填入环境 ID, 环境 ID 可打开云控制台查看
        //   如不填则使用默认环境(第一个创建的环境)
        env: 'test-simorel',
        traceUser: true,
      });
      try {
      	// 这个是云函数获取用户openid,你也可以用wx.login获取code,再从后台换取openid
        let { result } = await wx.cloud.callFunction({
          name: 'user',
          data: {
            $url: 'getOpenid'
          }
        });
        console.info('[app.js] [onLaunch] get openid success', result);
        openid = result;
        // 由于这里是网络请求,可能会在 Page.onLoad 之后才返回
        // 所以此处加入 callback 以防止这种情况
        if (this.openidCallback) {
          this.openidCallback(result);
        }
      } catch (err) {
        console.error('[app.js] [onLaunch] get openid fail', err);
      }
    }

    this.globalData = {
      /** 用户openid */
      openid
    }
  }
})
page.js
const appInstance = getApp();

Page({

    /**
     * 页面的初始数据
     */
    data: {
        /** 用户openid */
        openid: null
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad: async function (options) {
        console.log('[onLoad] appInstance.globalData', appInstance.globalData);
        if (appInstance.globalData && appInstance.globalData.hasOwnProperty('openid') && appInstance.globalData.openid) {
            console.info('[onLoad] appInstance.globalData.openid', appInstance.globalData.openid);
            this.setData({
                openid: appInstance.globalData.openid
            });
        } else {
            appInstance.openidCallback = openid => {
                console.info('[onLoad] [openidCallback] openid', openid);
                if (openid) {
                    this.setData({
                        openid
                    });
                }
            };
        }
    }
}
控制台

控制台
从控制台打印的信息可以明显看出,先执行的页面的onload,后异步执行的onLaunch。但是因为回调函数的存在,我们依然成功拿到了openid。

参考文献

[1] Ning 微信小程序onLaunch异步,首页onLoad先执行?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值