1.发现问题
最近在做一个小程序的登录页面的时候,要验证用户是否已经授权过小程序获得用户信息,所以在app.js里面的onLaunch函数(小程序初始化执行)用了api里面的getSetting方法,代码如下
//app.js
onLaunch(){
wx.getSetting({
// 获取用户的当前设置,返回值中只会出现小程序已经向用户请求过的权限(用户同意被请求的)
success:res=>{
// .xxx和['xxx']取值的区别
res.authSetting['scope.userInfo']
?
(console.log('已授权'),
// 把授权过的信息保存到全局
wx.getUserInfo({
success:data=>{
this.globalData.userInfo=data.userInfo
}
})
)
:
console.log('用户未授权');
}
})
},
然后在globalData里面初始化userInfo
//app.js
globalData: {
userInfo:'无'
},
好了接下来我们到登录页面去写一个授权的点击按钮
//login.wxml
<button open-type="getUserInfo" bindgetuserinfo="getuserinfo" wx:if="{{isShow}}">点击授权</button>
<view class="userimg"><image src="{{userImg}}"></image></view>
<view class="username">{{userName}}</view>
//login.js
const app=getApp()
const appG=app.globalData
console.log(app.globalData.userInfo);
Page({
/**
* 页面的初始数据
*/
data: {
userImg:'',
userName:'',
isShow:true
},
getUserInfo(e){
const userInfo=e.detail.userInfo
this.setData({
userImg:userInfo.avatarUrl,
userName:userInfo.nickName
})
},
好的接下来我们来点击这个按钮让它进行授权
点击允许
获取成功
2.问题关键
好的此时小程序的数据里面已经保存了我们同意授权的信息,我们再次编译页面来获取userInfo的值并把它保存到全局变量中(app.js的onLaunch中操作),并在login.js中输出它,需要格外注意的是我们此时编译的页面是login.wxml
看结果
输出的值是无,看到这里你以为是用户授权出问题了吗,来我们展开这个object
就tm离谱,两个一样的key不一样的value,让我们输出一下userInfo,得到的结果是无,也就是说真正的userInfo获取不到
3.问题出现的原因
经过一番查阅,发现是onLaunch的执行比本页面的onLoad函数(整个该页面的js)执行要慢,所以会出现上述情况,假设我现在编译的页面是主界面index.wxml,那我在我从编译进入index再到进入login页面的过程中那么函数执行的顺序就是index onLoad—>onLaunch—>login onLoad
4.问题解决的办法
如果获取userInfo的不是小程序的主页面,那么直接换成其他页面的编译,再从其他页面进来这个页面就可以获取到数据,如果是主页获取userInfo,那么就使用promise异步解决这个问题,教程网上搜得到的,此处不再赘述