查了很多资料说是异步问题,也做了修改,但还是为undefined。要怎么修改?求帮助、
app.js打印的图片
login.js打印的图片
// app.js
App({
onLaunch:async function () {
if (!wx.cloud) {
console.error('请使用 2.2.3 或以上的基础库以使用云能力');
} else {
wx.cloud.init({
env: '1g4z5k3lc74cf9e2',
traceUser: true,
});
}
this.globalData = {};
await this.loadUserInfo();
console.log('loadUserInfo有没有执行',this.loadUserInfo);
console.log('有没有获取到userInfo',this.globalData.userInfo);
},
async loadUserInfo() {
var that = this;
let loginOpenid = await wx.cloud.callFunction({
name:'logins',
})
console.log('获取用户openid',loginOpenid);
that.globalData.openid = loginOpenid.result.openid;
console.log('保存openid',that.globalData.openid);
const loginRes = await wx.cloud.database().collection('login')
.where({
_openid:'loginOpenid'
}).get()
console.log('查询是否有用户信息',loginRes);
that.globalData.userInfo = loginRes.data[0];
console.log('保存用户信息到globalData',that.globalData.userInfo);
},
is_login() {
console.log('is_logn获取',this.globalData.userInfo);
if (this.globalData.userInfo) {
return true
} else {
return false
}
},
})
login.js代码
// pages/login/login.js
const app = getApp();
const db = wx.cloud.database();
Page({
data: {
},
onLoad(options) {
},
// 获取头像
getAvatar(event) {
console.log('临时头像路劲地址',event.detail.avatarUrl); //临时头像路劲地址
let avatarUrl = event.detail.avatarUrl; //临时地址
let suffix = /\.[^\.]+$/.exec(avatarUrl)[0];
wx.cloud.uploadFile({
cloudPath: 'loginImages/' + new Date().getTime() + suffix,
filePath: avatarUrl //上传到云端的路劲,
}).then(res => {
console.log('头像路劲地址',res.fileID);
this.setData({
avatarUrl: res.fileID
})
})
},
async login(event) {
console.log(event);
let nickName = await event.detail.value.nickName;
console.log('用户名', nickName);
if(!nickName){
wx.showToast({
title:'请填写昵称',
icon:'error'
})
return
}
if(!this.data.avatarUrl){
wx.showToast({
title:'请上传头像',
icon:'error'
})
return
}
let openid =await app.globalData.openid;
console.log("获取app.globalData.openid",openid);
try{
let existingUserQuery = await db.collection('login').where({
_openid:openid
}).get();
console.log('获取用户信息',existingUserQuery)
if(existingUserQuery.data.length > 0){
this.setData({
userInfo:existiongUserQuery.data[0],
});
}else{
let newUser = {
num:Date.now(),
avatarUrl:this.data.avatarUrl,
nickName:nickName,
};
await db.collection('login').add({
data:newUser
});
}
}catch(err){
console.log('Error',err);
}
wx.showToast({
title:'登陆成功'
});
setTimeout(()=>{
wx.navigateBack({});
},1500)
},
})
user-center.js代码
const app = getApp();
console.log('是否有app信息',app)
const db = wx.cloud.database();
Page({
data: {
},
onLoad:async function(options) {
console.log('是否有传递数据',app.is_login());
if(app.is_login()){
this.setData({
userInfo: app.globalData.userInfo,
avatarUrl: app.globalData.userInfo.avatarUrl,
nickName: app.globalData.userInfo.nickName
})
}
onuserInfo(e){
wx.navigateTo({
url:'/pages/login/login'
})
},
await this.loadUserInfo();
这句代码不要在app.js的onLaunch里执行。
在page.js的onLoad里执行就行了。
onLoad: async function (options) { await app.loadUserInfo(); console.log(app.globalData.userInfo) },
记得现在的规则是:
用户点击按钮,再获取用户资料
仍然是异步问题
loadUserInfo函数内部随便return一个东西值,比如return loginRes这样await this.loadUserInfo() 才会在有返回值之后打印console.log('有没有获取到userInfo',this.globalData.userInfo);。否则异步还没结果,console.log就执行了
async loadUserInfo() {
var that = this;
let loginOpenid = await wx.cloud.callFunction({
name:'logins',
})
console.log('获取用户openid',loginOpenid);
that.globalData.openid = loginOpenid.result.openid;
console.log('保存openid',that.globalData.openid);
const loginRes = await wx.cloud.database().collection('login')
.where({
_openid:'loginOpenid'
}).get()
console.log('查询是否有用户信息',loginRes);
that.globalData.userInfo = loginRes.data[0];
console.log('保存用户信息到globalData',that.globalData.userInfo);
return loginRes
},
is_login() {
console.log('is_logn获取',this.globalData.userInfo);
if (this.globalData.userInfo) {
return true
} else {
return false
}
},
这个顺序是不是,先执行app.js中的is_login() 方法,再是我的页面中调用is_login,在调试器中,打印的结果中,顺序是这样?