小程序获取app.js中的全局变量为空
最近写小程序的时候,需要获取用户openid,在app.js使用了相关API获取用户信息,然后存到全局变量中,在其他页面使用的时候,发现获取全局变量的时候是空值。后才发现在小程序中,onLaunch 方法和 onLoad 方法是同时执行的,我需要等 onLaunch 方法执行完毕之后在 onLoad 方法中获取网络请求得到的openid,由于网络请求会比较慢,所以 onLoad 方法可能在 onLaunch 方法之前执行了。
这时候可以自定义 Callback 回调函数来解决问题
app.js
App({
/**
* 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
*/
globalData: {
openId:'',
unionId:'',
},
onLaunch: function () {
var that=this;
wx.login({
success(res){
console.log(res)
wx.request({
url:'url',
data: {
"code":res.code,
},
method: 'get',
header: {
'content-type': 'application/json'
},
success(res){
console.log(res)
//不能使用that.setData({})给全局变量赋值
that.globalData.unionId=res.data.unionid;
that.globalData.openId=res.data.openid;
// 由于login()是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入callback 以防止这种情况
if(that.loginCallBack){
that.loginCallBack(res)
}
},
fail(res){
console.log('网络请求失败'+res)
}
})
}
})
},
})
index.js
var app=getApp();
var openid=app.globalData.openId;
onShow: function (e) {
var that=this;
//使用回调桉树Callback函数给全局变量赋值
//同样不能使用that.setData({})赋值
app.loginCallBack=function(){
openid=app.globalData.openId
}
},
如果想在其他页面引用全局变量的话,需要在那个页面的onLoad方法中再次赋值:
onLoad: function (options) {
vipopenid=app.globalData.openId;
xxx=app.globalData.xxx;//其他变量
},
否则,全局变量的值可能还是为空!