获取用户信息主要在app.js 和 index.js中

app.js

  1. App({
  2. onLaunch: function () {
  3. // 展示本地存储能力
  4. var logs = wx.getStorageSync('logs') || []
  5. logs.unshift(Date.now())
  6. wx.setStorageSync('logs', logs)
  7. // 登录
  8. wx.login({
  9. success: res => {
  10. }
  11. })
  12. // 获取用户信息
  13. wx.getSetting({
  14. success: res => {
  15. if (res.authSetting['scope.userInfo']) {
  16. // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
  17. wx.getUserInfo({
  18. success: res => {
  19. // 可以将 res 发送给后台解码出 unionId
  20. this.globalData.userInfo = res.userInfo
  21. // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
  22. // 所以此处加入 callback 以防止这种情况
  23. if (this.userInfoReadyCallback) {
  24. this.userInfoReadyCallback(res)
  25. }
  26. }
  27. })
  28. }
  29. }
  30. })
  31. },
  32. globalData: {
  33. userInfo: null,
  34. }
  35. })

index.js

  1. //获取应用实例
  2. const app = getApp()
  3. Page({
  4. data: {
  5. motto: '欢迎使用迷你计算器',
  6. userInfo: {},
  7. hasUserInfo: false,
  8. canIUse: wx.canIUse('button.open-type.getUserInfo')
  9. },
  10. //事件处理函数
  11. bindViewTap: function() {
  12. wx.navigateTo({
  13. url: '../logs/logs'
  14. })
  15. },
  16. onLoad: function () {
  17. if (app.globalData.userInfo) {
  18. this.setData({
  19. userInfo: app.globalData.userInfo,
  20. hasUserInfo: true
  21. })
  22. } else if (this.data.canIUse){
  23. // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
  24. // 所以此处加入 callback 以防止这种情况
  25. app.userInfoReadyCallback = res => {
  26. this.setData({
  27. userInfo: res.userInfo,
  28. hasUserInfo: true
  29. })
  30. }
  31. } else {
  32. // 在没有 open-type=getUserInfo 版本的兼容处理
  33. wx.getUserInfo({
  34. success: res => {
  35. app.globalData.userInfo = res.userInfo
  36. this.setData({
  37. userInfo: res.userInfo,
  38. hasUserInfo: true
  39. })
  40. }
  41. })
  42. }
  43. },
  44. getUserInfo: function(e) {
  45. console.log(e)
  46. app.globalData.userInfo = e.detail.userInfo
  47. this.setData({
  48. userInfo: e.detail.userInfo,
  49. hasUserInfo: true
  50. })
  51. }
  52. })

首先执行的是app.js的wx.getUserInfo,这个是获取用户信息的网络请求,由于其返回结果不知道在index页面加载完成之前还是之后完成,因此分为两种情况:

  • 在index页面加载完成之前返回:此时优先执行app.js中success函数的代码,app.globalData.userInfo就保存了用户信息。运行到这里时,由于userInfoReadyCallback函数是在index.onload中定义的,因此此时该函数并没有被定义,所以不执行该函数。之后执行index.js中onload中的代码,执行第一个if分支,赋值给页面的userInfohasUserInfo
  1. if (this.userInfoReadyCallback) {
  2. this.userInfoReadyCallback(res)
  3. }
  • 在index页面加载完成之后返回:此时优先执行index.js中onload中的代码,由于用户信息还没有返回,所以app.globalData.userInfo为null,执行第二个if分支,定义userInfoReadyCallback函数。随后数据被返回,执行success的代码,app.globalData.userInfo在此时才保存了用户的信息,并执行userInfoReadyCallback函数,赋值给页面的userInfohasUserInfo

userInfoReadyCallback函数的作用,就是保证页面的userInfohasUserInfo被正确赋值,无论用户信息在页面加载完成之前还是之后返回。