写了段授权代码,设置全局配置时,is_login()中this.globalData.userInfo为undefined,在页面pages.user-center打印app.globalData.userInfo就是undefined,打印app.is_login()就是false,在pages.login页面中打印app.is_login()时为true,也就能够正常,打印app.globalData.userInfo又能够正常打印出来,请问这个问题怎么解决?
如图:
app.js代码
App({
onLaunch: function () {
if (!wx.cloud) {
console.error('请使用 2.2.3 或以上的基础库以使用云能力');
} else {
wx.cloud.init({
env: '',
traceUser: true,
});
}
this.globalData = {};
this.loadUserInfo();
},
loadUserInfo() {
//获取用户的openid
var that = this;
wx.cloud.callFunction({
name: 'login',
success(res) {
// console.log(res);
that.globalData.openid = res.result.openid
//查找数据库用户表里面是否有这个用户记录
wx.cloud.database().collection('login').where({
_openid: res.result.openid
}).get({
success(result) {
console.log(result)
// that.globalData.userInfo = result.data[0]
if(result.data[0]){
wx.setStorageSync('login',result.data[0])
// that.globalData.userInfo = wx.getStorageSync('userInfo')
that.globalData.userInfo = result.data[0]
console.log(that.globalData.userInfo); // 这里能够正常打印出来数据
}
}
})
}
})
},
is_login() {
console.log(this.globalData.userInfo); // 这里打印为undefined
if (this.globalData.userInfo) {
return true
} else {
return false
}
},
云函数代码:
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database();
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
}
}
pages.login页面代码:
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
})
})
},
login(event){
console.log(event.detail.value.nickName);
let nickName = event.detail.value.nickName;
if(!nickName){
wx.showToast({
title:'请填写昵称',
icon:'error'
})
return
}
if(!this.data.avatarUrl){
wx.showToast({
title:'请上传头像',
icon:'error'
})
return
}
var that = this;
console.log(app.is_login()); // 在这里又能够正常打印出来
db.collection('login').where({
_openid:app.globalData.openid
}).get({
success(res){
console.log(res)
if(res.data.length == 0){
//添加记录到数据库
// var avatarUrl = that.data.avatarUrl;
db.collection('login').add({
data:{
num:Date.now(),//!QQ号
avatarUrl:that.data.avatarUrl,
nickName:nickName
},
success(res){
console.log(res)
wx.showToast({
title:'登陆成功',
})
setTimeout(function(){
wx.navigateBack({})
},1500)
}
})
}else{
that.setData({
userInfo:res.data[0]
})
}
}
})
},
了解下promise then
loadUserInfo() {
var that = this;
wx.cloud.callFunction({
name: 'login',
}).then(res => {
// console.log(res);
that.globalData.openid = res.result.openid
console.log(that.globalData.openid );
wx.cloud.database().collection('login').where({
_openid: res.result.openid
}).get().then(result => {
console.log(result)
if(result.data[0]){
// wx.setStorageSync('login',result.data[0])
// that.globalData.userInfo = wx.getStorageSync('userInfo')
that.globalData.userInfo = result.data[0]
console.log(that.globalData.userInfo);
}
})
})
},
异步请求,肯定啊,你现在这种写法,数据都还没有获取到,就在输出,那肯定没有啊,不是说代码写在后面,就是后执行
js异步问题,去了解一下。
看到两个undefined的打印顺序吗?排在数据获取到之前。在数据获取到之前打印,当然是空的。
let res = await getData()//耗时操作
console.log(res)//此时res里才会有数据。
async function(){
await xxx()
}