小程序app.onLaunch中获取用户信息,index.onLoad初次载入时取不到值的问题

摘要:
问题description://app.jsApp({globalData:{昵称:“”},onLaunch:function(){letthat=this;//假设授权成功索引js
问题描述:
//app.js
App({
  globalData:{
    nickname:''
  },
  onLaunch: function () {
    let that=this;
    //假设已经授权成功
    wx.getUserInfo({
        success(res){
            //获取用户信息并赋值给globalData
            that.globalData.nickname=res.userInfo.nickName;
        }
    })


  }
})

//index.js
const app = getApp()
Page({
  data: {
    myNickName:''
  },
  onLoad: function (option) {
    console.log(app.globalData.nickname); //结果:"" 
    this.setData({
        myNickName:app.globalData.nickname
    })
    //由于wx.getUserInfo()是异步请求,不知道什么时候成功返回数据,导致获取失败
  }
})

时序图描述:

小程序app.onLaunch中获取用户信息,index.onLoad初次载入时取不到值的问题第1张

解决方案
//app.js
App({
  globalData:{
    nickname:''
  },
  onLaunch: function () {
    let that=this;
    //假设已经授权成功
    wx.getUserInfo({
      success(res) {
        let tmp=res;
        
        setTimeout(()=>{//更清楚的模拟异步环境,设置5秒后执行代码
          //获取用户信息并赋值给globalData
          that.globalData.nickname = res.userInfo.nickName;
          if (that.userInfoReadyCallback) {
            console.log('call back')
            that.userInfoReadyCallback(res.userInfo.nickName)
          }
        },5000)

      }
    })

  }
})

//index.js
const app = getApp()
Page({
  data: {
    myNickName:''
  },
  onLoad: function (option) {
    let that = this;
    let mynickname = app.globalData.nickname;
    //如果app.onLaunch中的wx.getUserInfo()返回够快
    //在app.onLoad之前就已经初始化了app.globalData.nickname则直接更新本界面的this.data.nickname
    if(mynickname.length){
      this.setData({
        nickname:mynickname
      })
    //定义回调函数,一旦app.onLaunch的wx.getUserInfo获取到用户信息的时候,立即运行该回调函数
    }else{
      app.userInfoReadyCallback=res=>{
        this.setData({
          nickname:res
        })
      }
    }
  }
})

解决方案时序图:

小程序app.onLaunch中获取用户信息,index.onLoad初次载入时取不到值的问题第2张

总结

1.巧用回调函数

参考:https://blog.csdn.net/zjw_python/article/details/80641963

免责声明:文章转载自《小程序app.onLaunch中获取用户信息,index.onLoad初次载入时取不到值的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇安装在CloudStack时CentOS6.4中安装MySQL通过mysql_secure_installation方式修改密码委外核销下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Navicat破解方法(仅供学习)

最近在学习PHP,MySQL,CMS,想要快速做一个个人站或者企业站这种; 因此学习路线实际是从CMS再到MySQL的; 但是MySQL是没有图形化界面的,对于博主这种菜鸟,感觉不太习惯; 因此去网上找了鼎鼎大名的Navicat,但是苦于这是个收费软件,不大利于长期学习; So,找了一个非常好用的科学使用方法: 原文地址:https://defcon.cn...

前端工程师技能之photoshop巧用系列第一篇——准备篇

前面的话   photoshop是前端工程师无法回避的一个软件,这个软件本身很强大,但我们仅仅需要通过这个工具来完成基本的切图工作即可。本文将开始photoshop巧用系列的第一篇——准备篇 作用   我们为什么要去切图呢?这就需要说到项目流程。一个完整的项目流程是市场进行需求分析,产品做出项目原型,UI根据项目原型出设计图,前端根据设计图制作页面,后端进...

GPU渲染和GDI

   要实现这样一段逻辑,用GPU画3D图,用GDI画二维图元,怎么样效率高。相传Vista年代,是这样干的: 硬件渲染的东西在GPU上做完 读回CPU端 把GDI这些用软件渲染 两者混合 拷贝到显存显示 这样的话,相当于整个屏幕都要维持2份拷贝,并且要互相同步。早期的vista驱动上,D3D/OGL和GDI混合使用的话闪得要死或者慢的要死,就是这个原...

Uniapp 之小程序版本更新检查——uni.getUpdateManager()

在开发小程序的时候,版本更新在所难免。所以,我们希望每次打开的小程序的时候,都可以进行版本检测。如果有新版本,那么,就更新,并且让用户能够重启,并应用新版本。 实现 开门见山,uni-app官方网站给了我们实现方法。以下是代码示例。 const updateManager =uni.getUpdateManager(); updateManager.on...

iOS 进入后台的处理

当App进入后台时(按下Home键), App会被系统暂停, 所有的程序逻辑都会停止, App还是驻留内存中, 除非被用户强制退出, 或者被系统kill掉(为了保证正在前台运行的App有足够的内存, 系统会选择性的kill掉后台的其他App), 当然这个和本文讨论的主题不太相关, 本文要讲的是如何让进入后台的App争取更多的运行时间而不是被马上暂停掉. 当...

Linux 中如何卸载已安装的软件

Linux 中如何卸载已安装的软件.   Linux软件的安装和卸载一直是困扰许多新用户的难题。在Windows中,我们可以使用软件自带的安装卸载程序或在控制面板中的“添加/删除程序”来实现。与其相类似,在Linux下有一个功能强大的软件安装卸载工具,名为RPM。它可以用来建立、安装、查询、更新、卸载软件。该工具是在命令行下使用的。在Shell的提示符...