m0_62833091 2024-06-06 23:47 采纳率: 66.7%
浏览 5
已结题

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

用户授权,在app.js中做全局变量,打印出来是undefined,查了很多资料说是异步问题,从来没有做过异步类的问题,修改后还是同样的问题,这段代码要怎么改呢?求助

img

app.js代码:

// app.js
App({
  onLaunchfunction () {
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力');
    } else {
      wx.cloud.init({
        env'',
        traceUsertrue,
      });
    }

    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({
            successres => {
              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'
        })       
    },

  • 写回答

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可能会导致小程序启动缓慢。
    • 考虑使用状态管理库或全局状态管理来更好地管理全局数据,尤其是在复杂的应用中。

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

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月23日
  • 创建了问题 6月6日

悬赏问题

  • ¥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,可付费