m0_62833091 2024-06-07 16:05 采纳率: 66.7%
浏览 12
已结题

微信小程序全局变量异步问题,globalData.userInfo为undefined?

授权做一个全局变量,异步问题,打印出来后undefined,要如何修改才行?求帮助
app.js打印结果:

img


login.js打印结果:

img


app.js代码:

// app.js
App({
  onLaunch:async function () {
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力');
    } else {
      wx.cloud.init({
        env: ,
        traceUsertrue,
      });
    }
    this.globalData = {};
    await this.loadUserInfo();

  }
             
   async loadUserInfo() {
    var that = this;
    const loginRes = await wx.cloud.database().collection('login')
      .where({
        _openid'openid'
      }).get()
    console.log(loginRes);
    that.globalData.userInfo = loginRes.data[0];
    console.log(that.globalData.userInfo);
  },
  is_login() {
    console.log(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
            })
        })
    },
    login(event){
        var that = this;
        console.log(event.detail.value.nickName);
        let nickName = event.detail.value.nickName;
        // let avatarUrl = that.data.avatarUrl;
        if(!nickName){
            wx.showToast({
                title:'请填写昵称',
                icon:'error'
            })
            return
        }
        if(!this.data.avatarUrl){
            wx.showToast({
                title:'请上传头像',
                icon:'error'
            })
            return
        }
      async login(event) {
    console.log(event);
    var that = this;
    let nickName = await event.detail.value.nickName;
    console.log('用户名', nickName);
    let avatarUrl = await that.data.avatarUrl;
    console.log('用户头像', avatarUrl);
    let openid =await app.globalData.openid;
    console.log("获取app.globalData.openid",openid);
    db.collection('login').where({
      _openid:openid
    }).get({
      success (res){
        console.log('查询是否有用户信息',res)
        if(res.data.length == 0){
          //添加记录到数据库
          db.collection('login').add({
            data:{
              num:Date.now(),//!QQ号
              avatarUrl:avatarUrl,
              nickName:nickName
            },
            success(result){
              console.log('登陆成功',result)
              wx.showToast({
                title:'登陆成功',
              })
              setTimeout(function(){
                wx.navigateBack({})
              },1500)
            }
          })
        }else{
          console.log("用户已存在")
          that.setData({
            userInfo:res.data[0]
          })
        }
      }
    })
  },

我的页面user-center.js代码

// pages/user-center/user-center.js
const app = getApp();
const db = wx.cloud.database();
Page({

    /**
     * 页面的初始数据
     */
    data: {

    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(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(){ 
        wx.navigateTo({
            url:'/pages/login/login'
        })       
    },

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-07 16:05
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    从您提供的代码和描述来看,主要问题在于异步操作的时机控制以及全局变量globalData的更新和访问。以下是一些建议和解决方案:

    1. 异步操作的时机问题

    app.jsonLaunch函数中,loadUserInfo是一个异步函数,但是您在调用后没有等待其完成就打印了globalData.userInfo,这可能导致在数据还未加载完成时就进行了打印。

    解决方案

    • 使用await关键字等待loadUserInfo函数完成后再进行打印。
    onLaunch: async function () {
      // ...其他代码
      this.globalData = {};
      await this.loadUserInfo(); // 等待异步函数完成
      console.log(this.globalData.userInfo); // 此时应该已经打印出用户信息
    }
    

    2. globalData的更新和访问

    login.js中,您尝试访问app.globalData.openid,但是openid可能还未被赋值。

    解决方案

    • 确保在app.jsopenid被正确赋值后再进行访问。
    • login.js中,您可能需要在onLoadonShow生命周期中进行登录状态的检查和用户信息的加载。

    3. 代码逻辑调整

    • login.js中,您定义了两次login函数,这可能是一个错误。请确保只有一个login函数,并且逻辑正确。

    4. 使用Promise进行状态管理

    如果异步操作较为复杂,可以考虑使用Promise来管理状态,确保在数据加载完成后再进行下一步操作。

    5. 检查openid的赋值

    app.js中,您需要确保openid在调用loadUserInfo之前被正确赋值。如果openid依赖于用户登录操作,那么您需要在登录成功后再进行openid的赋值。

    6. 检查网络请求

    根据您提供的截图,网络请求可能存在问题。例如,login.js中的数据库查询使用了错误的_openid值('openid'字符串而不是变量)。确保网络请求使用正确的参数。

    7. 调试和日志

    增加更多的console.log语句,以帮助您追踪程序的执行流程和变量的值。

    8. 参考资料

    最后,建议您在开发过程中使用微信开发者工具的调试功能,逐步跟踪和解决问题。如果您需要进一步的帮助,请提供更多的代码实现细节。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月28日
  • 已采纳回答 7月20日
  • 创建了问题 6月7日

悬赏问题

  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费