当小程序使用编译模式调试某个页面时。在onready里面获取全局变量会有延迟的情况,(这是我遇到的问题,不知道你们会不会),使用定时器的时候可以清楚的看到多少秒后,这些数据就可以拿到
解决方法
userInfoReadyCallback 需要再onload里面使用
获取用户信息的网络请求,由于其返回结果不知道在index页面加载完成之前还是之后完成,因此分为两种情况:
1.在index页面加载完成之前返回:这时会优先执行app.js
中success
函数的代码,app.globalData.userInfo.openid_mini
就会有值。运行到这里时,由于userInfoReadyCallback
函数是在index.onload中
定义的,因此此时该函数并没有被定义,所以不执行该函数。之后执行index.js
中onload中
的代码,执行第一个if分支,赋值给页面的userInfo
和isShowlogin
和isbindOpenid
。
2.在index页面加载完成之后返回,这时就会延迟:这时会优先执行index.js
中onload
函数的代码,由于用户信息还没有返回,app.globalData.userInfo.openid_mini
为undefined,执行第二个else分支,定义userInfoReadyCallback
函数和isloginCallback
函数返回数据,赋值给isShowlogin
和isbindOpenid
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
var that = this;
if (app.globalData.userInfo.openid_mini) { //当可以获取到openid时
that.setData({
isShowlogin: app.globalData.islogin,
isbindOpenid: app.globalData.isbindOpenid,
userInfo: app.globalData.userInfo
});
} else{
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
app.userInfoReadyCallback = res => {
this.setData({
userInfo: app.globalData.userInfo
});
}
app.isloginCallback = res => {
//console.log(res);
this.setData({
isShowlogin: res,
isbindOpenid: res,
});
}
}
},
userInfoReadyCallback ,和isloginCallback 分别在app.js里面写
//登录从新获取openid
Login:function(fnback) {
let that = this;
let gData = this.globalData;
wx.login({
success: function (res) {
if (res.code) {
//发起网络请求
wx.request({
method: "POST",
url: gData.requesturl + 'GetOpendid',
data: {
gid: gData.gid,
code: res.code
},
success: function (res) {
//console.log("从新获取openid");
//console.log(res);
if (res.errMsg === "request:ok") {
gData.userInfo.openid_mini = res.data.openid;
}
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (that.userInfoReadyCallback) {
that.userInfoReadyCallback(res)
}
if (fnback)
fnback(res.data.openid);
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
},
//另一个请求方法里的
if (that.isloginCallback)
that.isloginCallback(true)
}