首先要说明在小程序中,app.js和index.js是异步执行的,也就说明可能当你app.js中onlaunch的登录、通过code获取open_id之类的网络请求在执行的时候,index.js中的onload已经执行完了,如果你在index的onload中有需要用到openid的话,那就会无法执行调用了。
这个时候就需要通过用 请求的callback方法啦,如果你细心去看,其实在app.js的获取用户信息中,已经帮你写好了回调。
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
上面这句是判断userInfoReadyCallback是否已经定义,如果还没有定义,说明这里的网络请求在index.onload定义userInfoReadyCallback之前运行,这个时候说明app.globalData.user_id已经存在。
如果userInfoReadyCallback已经定义了,说明index.onload已经执行了,此时app.globalData.user_id为null,所以需要重新赋值,及在index.onload的回调中进行赋值
接下来就是在index.js中的onload里面判断是否已经有openid,如果已经存在openid,那么就不会影响你接下来的操作,如果没有就执行回调方法,在回调方法中就可以获取到你需要的值
if(!app.globalData.user_id){
app.userInfoReadyCallback = res => {
//业务代码
}
}
详细代码↓
app.js
// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
console.log(res)
wx.request({
url: that.globalData.url + 'code_to_openid',
method:'post',
header: { 'Content-Type': 'application/x-www-form-urlencoded' },
data:{
code:res.code
},
success(res){
console.log(res)
that.globalData.user_id = res.data.data.id
that.globalData.unionid = res.data.data.unionid
that.globalData.user_info = res.data.data
//callback
if (that.userInfoReadyCallback) {
that.userInfoReadyCallback(res)
}
}
})
}
})
index.js
onLoad: function() {
let that = this
//查看是否有userid
if(!app.globalData.user_id){
app.userInfoReadyCallback = res => {
//判断是否阅读过引导页
wx.request({
url: app.globalData.url + 'checkfirst',
method: 'POST',
header: { "Content-Type": "application/x-www-form-urlencoded" },
data: {
user_id: app.globalData.user_id
}, success(res) {
console.log(res)
if (res.data.resultCode == 0 || res.data.resultCode == ''){
wx.hideTabBar()
that.setData({
guide_show:true
})
}
}
})
}
}
}