小程序app.js加载慢导致user.js获取到全局变量数据为空的解决办法

【问题描述】

今天写小程序项目的时候发现了一个bug,页面加载顺序问题:
我自己写了一个user界面,调用use.js初始化时需要根据app.js里面全局变量globalData的openid判断是否将用户信息存入云数据库,但是调试的时候发现加载顺序有问题。
点开调试器发现,页面先加载了user.js,导致我的user.js里面写的一个接口获取到的App.globalData.openid为空,然后判断此用户不存在,一直不断重复插入用户数据,等user.js全部加载完才加载app.js,将获取到的openid存入全局变量。

【解决方法】

这里我用的解决办法是加个定时器,在user.js里一直执行,直到app.js执行完毕将获取到的openid存入全局变量,再执行user.js调用的接口,这样就能让app.js先加载完后再执行user.js里面的那个接口,解决加载顺序问题。

【 user.js 部分】
// 第一步:在data里面加上定时器设置
data:{
	setInter: '', //设置定时器
},

// 第二步:在onLoad里面调用接口
onLoad: function (options) {
    this.startSetInter()
}

// 第三步:设置定时
startSetInter: function () {
     var that = this;
     //将计时器赋值给setInter
     that.data.setInter = setInterval(
        function () {
            that.queryUser() //这里的queryUser()是我自己写的去云数据库获取数据的接口
        }, 2000);
  },

下面是我自己写的queryUser接口:

// 我写的queryUser方法:检查数据库是否有此用户
// 贴上这个接口是因为有一行代码很重要,要取消定时器:
// clearInterval(that.data.setInter) 
    queryUser: function () {
        var that = this
        const openid = app.globalData.openid
        console.log("【queryUser】用户openid:", openid)
        if (openid == null) {
            return
        } else {
            const db = wx.cloud.database()
            db.collection('数据库表名').where({
                _openid: openid
            }).get({
                success: res => {
                    // 存在此用户
                    if (res.data.length > 0) {
                        that.setData({
                            motto: res.data[0].motto
                        })
                    } else {
                        that.addNewUser()  //如果没有用户就插入用户信息
                    }
                    clearInterval(that.data.setInter) //最重要的是这里要取消定时了
                    console.log("用户查询成功:", res)
                },
                fail: err => {
                    wx.showToast({
                        title: '用户查询失败',
                        icon: 'none'
                    })
                    console.error("用户查询失败:", err)
                }
            })
        }
    },

由于我只是完成自己的期末作业,所以代码没考虑很多,比较简单,直接在app.js里面获取openid,希望有帮助吧!

【参考大佬的链接】
微信小程序app.js加载慢导致home.js无法获取到userId的解决办法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序中,可以在 app.js 中定义全局变量,并在页面内通过 getApp().变量名 的方式进行引用。 首先,在 app.js 中,我们可以使用 App() 函数创建小程序的实例,并在实例的 data 对象中定义全局变量。例如,我们可以在 app.js 的 App() 函数中定义一个名为 globalData 的对象,并在其中定义一个名为 variableName 的全局变量,如下所示: ```javascript App({ globalData: { variableName: '全局变量的内容' } }) ``` 接下来,在页面的 js 文件中,我们可以通过 getApp() 函数获取小程序实例并访问其中的全局变量。例如,如果我们想在页面中使用上面定义的 variableName 变量,可以使用如下代码: ```javascript // pages/pageName/pageName.js Page({ onLoad: function () { var appInstance = getApp(); var variableValue = appInstance.globalData.variableName; console.log(variableValue); // 输出:全局变量的内容 } }) ``` 在这段代码中,我们通过 getApp() 函数获取小程序实例,并将其赋值给变量 appInstance。然后,我们可以通过 appInstance.globalData.variableName 来访问全局变量的值,并将其赋值给变量 variableValue。最后,我们使用 console.log() 函数将该变量的值打印到控制台上。 这样,我们就可以在微信小程序的页面内引用 app.js 中定义的全局变量了。请注意,全局变量只能在 app.js 中定义,但可以在小程序的所有页面中通过 getApp().变量名 进行引用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值