收藏
回答

globalData打印出来是undefined?

写了段授权代码,设置全局配置时,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]
                    })
                }
            }
            
        })
    },
回答关注问题邀请回答
收藏

3 个回答

  • dreamhunter
    dreamhunter
    06-03

    了解下promise then

    06-03
    有用
    回复 1
    • 蓝天☁
      蓝天☁
      06-03
      一样的问题
      06-03
      回复
  • 那一抹笑😃 穿透阳光
    那一抹笑😃 穿透阳光
    06-03

    异步请求,肯定啊,你现在这种写法,数据都还没有获取到,就在输出,那肯定没有啊,不是说代码写在后面,就是后执行

    06-03
    有用
    回复 1
    • 蓝天☁
      蓝天☁
      06-03
      代码要怎么写?查了些资料,说用await,不知道怎么弄
      06-03
      回复
  • 跨商通
    跨商通
    06-03

    js异步问题,去了解一下。

    看到两个undefined的打印顺序吗?排在数据获取到之前。在数据获取到之前打印,当然是空的。


    06-03
    有用
    回复 4
    • 蓝天☁
      蓝天☁
      06-03
      代码要怎么写?查了些资料,说用await,不知道怎么弄
      06-03
      回复
    • 跨商通
      跨商通
      06-03回复蓝天☁
      那就继续学喽。都知道方向了。你不先学,我写出来代码你也看不懂。
      06-03
      回复
    • 蓝天☁
      蓝天☁
      06-03回复跨商通
      对这个await不知道怎么用,用在哪,所以感觉用在哪都报错
      06-03
      回复
    • 跨商通
      跨商通
      06-03回复蓝天☁
      必须要和async结合使用。看教程去吧。
      06-03
      回复
登录 后发表内容