在讲之前要说明一下微信用户的信息获取是网络请求而网络请求是异步的。
注意:网络请求你不知道它什么时候返回
在app.js文件中有一段代码
if ( this .userInfoReadyCallback) { this .userInfoReadyCallback(res) } |
意思是当userInfoReadyCallback对象没有定义时,不执行。当userInfoReadyCallback对象被定义时,执行this
.userInfoReadyCallback(res)
即调用回调函数(用户定义由系统调用)。
而index.js文件中有一段代码
app.userInfoReadyCallback = res => { this .setData({ userInfo: res.userInfo, hasUserInfo: true }) } |
这段代码是定义了userInfoReadyCallback回调函数,这里要注意下“=>”号,这是一个ES6的新语法——箭头函数。上面的语法相当于app.userInfoReadyCallback(res){
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
}
分析:
如果 userInfoReadyCallback对象没有定义说明index.js中的Page.onLoad()函数还没有执行,但getUserInfo()函数网络请求已经返回。app.js中的变量globalData.userInfo中有数据。所有就没有必要再执行userInfoReadyCallback回调函数来将设置index.js中的相关变量了。
如果 userInfoReadyCallback对象被定义说明index.js中的Page.onLoad()函数已经执行,此时getUserInfo()函数网络请求返回。但app.js中app.js中的变量globalData.userInfo中刚获取数据。所以需要执行userInfoReadyCallback回调函数来将数据传递给index.js中相应的变量。
小弟也是刚开始学习微信小程序,希望大家不吝赐教!多多交流~
赞,期待异步问题最佳解决方案