• 用户授权设置全局变量为undefined?


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 m0_62833091 2024-06-06 23:47 采纳率: 27.3% 浏览 4 首页/ 小程序 / 用户授权设置全局变量为undefined? 微信小程序 用户授权,在app.js中做全局变量,打印出来是undefined,查了很多资料说是异步问题,从来没有做过异步类的问题,修改后还是同样的问题,这段代码要怎么改呢?求助 app.js代码: // app.js App({   onLaunch: function () {     if (!wx.cloud) {       console.error('请使用 2.2.3 或以上的基础库以使用云能力');     } else {       wx.cloud.init({         env: '',         traceUser: true,       });     }     this.globalData = {};     this.loadUserInfo();   },   async loadUserInfo() {     var that = this;     return await wx.cloud.database().collection('login')       .where({         _openid: 'openid'       }).get(         new Promise((resolve, reject) => {           wx.getSetting({             success: res => {               console.log(res);               const isuserInfo = res.authSetting['scope.userInfo']               if (isuserInfo) {                 wx.cloud.database().collection('login').where({                   _openid: 'openid'                 }).get().then(result => {                   console.log(result)                   that.globalData.userInfo = result.data[0]                 })               }             }           })         })       )   },   is_login() {     console.log(this.globalData.userInfo);     if (this.globalData.userInfo) {       return true     } else {       return false     }   }, // 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         }         console.log(app.globalData.userInfo);         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({},1500) 我的页面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'         })            }, 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    1条回答 默认 最新

    • 阿里嘎多学长 2024-06-06 23:57
      关注

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


      从您提供的代码和描述来看,问题主要出在异步操作的处理上。在JavaScript中,异步操作通常涉及到回调函数、Promises、async/await等概念。在您的代码中,您使用了async/await来处理异步请求,但是存在一些错误和不当之处。

      问题分析

      1. 异步函数中的await使用不当:在loadUserInfo函数中,您尝试使用await来等待一个异步操作,但是您错误地将await用在了new Promise的创建过程中,这是不正确的。await应该用在返回Promise的异步函数调用上。

      2. 全局变量globalData的赋值时机问题:由于异步操作的不确定性,您不能保证在onLaunch函数执行完毕时globalData已经被正确赋值。

      3. loadUserInfo函数中的逻辑错误:您在loadUserInfo中嵌套了多个异步操作,但是没有正确地处理它们之间的依赖关系。

      代码修改建议

      以下是对您的代码的一些建议修改:

      1. 简化loadUserInfo函数:使用async/await来简化异步操作。
      async loadUserInfo() {
        const that = this;
        const res = await wx.getSetting();
        const isUserInfo = res.authSetting['scope.userInfo'];
        if (isUserInfo) {
          const loginRes = await wx.cloud.database().collection('login').where({
            _openid: 'openid'
          }).get();
          console.log(loginRes);
          that.globalData.userInfo = loginRes.data[0] || {};
        }
      }
      
      1. 确保globalDataonLaunch中被正确赋值:在onLaunch中调用loadUserInfo后,您需要等待其完成,然后再进行其他操作。
      onLaunch: async function () {
        // ... 省略其他代码 ...
        this.globalData = {};
        await this.loadUserInfo(); // 等待异步函数完成
        // 这里可以继续其他初始化操作
      },
      
      1. login.jsuser-center.js中正确使用globalData:确保在访问globalData之前,它已经被正确赋值。

      参考资料

      注意事项

      • 确保在onLaunch中使用await时,不要阻塞主线程,因为onLaunch是同步执行的,使用await可能会导致小程序启动缓慢。
      • 考虑使用状态管理库或全局状态管理来更好地管理全局数据,尤其是在复杂的应用中。

      希望这些建议能帮助您解决问题。如果您还有其他问题或需要进一步的帮助,请随时提问。

      展开全部

      评论 编辑记录
      m0_62833091 2024-06-07 15:46

      还是同样的问题,我又改成云函数方式,还是一样的问题,是不是login.js或者user-center.js有问题?修改后的代码:  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);   }, login.js修改后的代码  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]           })         }       }     })   },

      回复
      编辑
      预览

      报告相同问题?

    • 相关阅读:
      Java 基于微信小程序的学生选课系统
      数据库设计规范
      机器学习之桑基图(用于用户行为分析)
      SpringBoot的Cacheable缓存问题一则
      解决QT编译Android程序不支持openssl问题
      MSTP理论讲解
      购买新风机那些注意事项?
      你知道吗?小程序组件≠小程序插件
      VLAN技术 — Super VLAN
      常用SQL——IF介绍
    • 原文地址:https://ask.csdn.net/questions/8115230