通常我们在app.js里边获取用户信息,小程序网络请求默认为异步请求,在appjs的onLaunch运行后进行异步请求时,程序不会停止,Page页已执行onload, 我们希望app.js获取用户信息异步执行完后,再执行page页面的一些逻辑,比如获取用户信息。
实现方法是,动态的给app.js添加回调函数。在回调函数获取用户信息。
// app.js
const {getOpenId, getUserInfo} = require('./api/userApi.js');
App({
onLaunch: function () {
// 检查注册
this.checkLogin();
},
globalData: {
baseApi: 'https://park-developers.ctfoparking.com/', // 预发布地址
openId: '', // 用户openId
session_key: '', // session_key
userInfo: null, // 用户信息
},
// 检查注册
async checkLogin() {
// 获取微信用户ID
let res = await this.getUserOpenId();
if (res.openId) {
this.globalData.openId = res.openId;
// 获取用户信息
getUserInfo({openId: res.openId}).then((data) => {
// 已经注册
if (!data.code) {
this.globalData.userInfo = data;
} else {
// 没有注册
data = null;
}
// checkLoginReadyCallback方法是在page页面动态添加的
if (this.checkLoginReadyCallback){
this.checkLoginReadyCallback(data);
}
}).catch((err) => {
if (this.checkLoginReadyCallback){
this.checkLoginReadyCallback(null);
}
})
} else {
if (this.checkLoginReadyCallback){
this.checkLoginReadyCallback(null);
}
}
},
// 获取openId
getUserOpenId() {
return new Promise((resolve, reject) => {
wx.login({
success:({code}) =>{
if (code) {
getOpenId({code}).then((data) => {
if (data.openid) {
this.globalData.openId = data.openid;
this.globalData.session_key = data.session_key;
resolve({openId: data.openid})
} else {
reject(data)
}
}).catch((err) => {
reject(err)
})
}
}
})
})
}
})
// pages/index
const app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
userInfo: null, // 用户信息
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 用户信息已经获取
if (app.globalData.userInfo) {
this.setData({
userInfo: app.globalData.userInfo,
})
/*
逻辑代码从这里开始
*/
} else {
// 动态添加回调方法 获取用户信息
app.checkLoginReadyCallback = res => {
// 用户信息
if (res) {
this.setData({
userInfo: res,
})
/*
逻辑代码从这里开始
*/
} else {
// 没有注册
}
};
}
}
})