遇到这个问题,是因为自己需要写个登录的功能。需要用户自己点击登录后,才登录。
登录的功能函数写在app.js中,现在需要在user.js中使用这个全局的函数,来登录并获取用户信息。但是出现的问题就是,点击登录按钮,虽然能获取到用户信息,但是都是简单的,不是后台处理过的,我们想要的信息。如果退出后重新登录的话,就能获取到用户信息。 也就是说,这个登录的没有同步执行,先获取到用户的简单信息,后异步获取到后台传过来的数据。所以,总会有个滞后的感觉。
下面看下代码:
//app.js
getUserInfo:function(cb){
var that = this
// if(this.globalData.userInfo){
// typeof cb == "function" && cb(this.globalData.userInfo)
// }else{
//调用登录接口
wx.login({
success: function (res) {
var code = res.code;
//get wx user simple info
wx.getUserInfo({
success: function (res) {
that.globalData.userInfo = res.userInfo
// typeof cb == "function" && cb(that.globalData.userInfo);
//get user sessionKey
//get sessionKey
//执行完上面的后,就返回了用户数据。
//并不是想要的经过处理的用户数据。
that.getUserSessionKey(code);
}
});
}
});
// }
},
getUserSessionKey:function(code){
//用户的订单状态
var that = this;
wx.request({
url: that.d.ceshiUrl + '/Api/Login/getsessionkey',
method:'post',
data: {
code: code
},
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
success: function (res) {
//--init data
var data = res.data;
if(data.status==0){
wx.showToast({
title: data.err,
duration: 2000
});
return false;
}
that.globalData.userInfo['sessionId'] = data.session_key;
that.globalData.userInfo['openid'] = data.openid;
that.onLoginUser();
},
fail:function(e){
wx.showToast({
title: '网络异常!err:getsessionkeys',
duration: 2000
});
},
});
},
onLoginUser:function(){
var that = this;
var user = that.globalData.userInfo;
wx.request({
url: that.d.ceshiUrl + '/Api/Login/authlogin',
method:'post',
data: {
SessionId: user.sessionId,
gender:user.gender,
NickName: user.nickName,
HeadUrl: user.avatarUrl,
openid:user.openid
},
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
success: function (res) {
//--init data
// console.log(res);
var data = res.data.arr;
var status = res.data.status;
if(status!=1){
wx.showToast({
title: res.data.errMsg,//垃圾
duration: 3000
});
return false;
}
// console.log(data);
that.globalData.userInfo['id'] = data.ID;
that.globalData.userInfo['NickName'] = data.NickName;
that.globalData.userInfo['HeadUrl'] = data.HeadUrl;
that.globalData.userInfo['class_sta'] = data.class;
var userId = data.ID;
if (!userId){
wx.showToast({
title: '登录失败!',
duration: 3000
});
return false;
}
that.d.userId = userId;
},
fail:function(e){
wx.showToast({
title: '网络异常!err:authlogin',
duration: 2000
});
},
});
},
下面是user.js中的:
//user.js
这里使用app.getUserInfo()函数,就是app.js中的那个函数
login:function(){
var that = this;
//调用应用实例的方法获取全局数据(app.js)
// app.getUserInfo(function (userInfo) {
// //更新数
// that.setData({
// // class_sta: value,
// class_sta: userInfo.class_sta,
// userInfo: userInfo,
// login: true
// })
// console.log(app.globalData);
// });
console.log(app.globalData);
that.setData({
class_sta: app.globalData.userInfo.class_sta,
userInfo: app.globalData.userInfo,
login: true
})
},
就是上面的代码出现了上面说的问题。
后来,经过了好长的时间就这个登录的问题,我差不多话费了一天。就各种调试,百度等等。后来就有了自己的解决办法。但是觉得不太理想,如果大家有好的解决办法。可以留言给我哦。或者访问点击打开链接联系我哦。
上代码:
getUserInfo:function(cb){
var that = this
//调用登录接口
wx.login({
success: function (res) {
var code = res.code;
//get wx user simple info
wx.getUserInfo({
success: function (res) {
that.globalData.userInfo = res.userInfo
//get user sessionKey
//get sessionKey
//执行完上面的后,就返回了用户数据。
//并不是想要的经过处理的用户数据。
that.getUserSessionKey(code);
}
});
}
});
},
getUserSessionKey:function(code){
//用户的订单状态
var that = this;
wx.request({
url: that.d.ceshiUrl + '/Api/Login/getsessionkey',
method:'post',
data: {
code: code
},
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
success: function (res) {
//--init data
var data = res.data;
if(data.status==0){
wx.showToast({
title: data.err,
duration: 2000
});
return false;
}
that.globalData.userInfo['sessionId'] = data.session_key;
that.globalData.userInfo['openid'] = data.openid;
that.onLoginUser();
},
fail:function(e){
wx.showToast({
title: '网络异常!err:getsessionkeys',
duration: 2000
});
},
});
},
onLoginUser:function(){
var that = this;
var user = that.globalData.userInfo;
wx.request({
url: that.d.ceshiUrl + '/Api/Login/authlogin',
method:'post',
data: {
SessionId: user.sessionId,
gender:user.gender,
NickName: user.nickName,
HeadUrl: user.avatarUrl,
openid:user.openid
},
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
success: function (res) {
//--init data
// console.log(res);
var data = res.data.arr;
var status = res.data.status;
if(status!=1){
wx.showToast({
title: res.data.errMsg,//垃圾
duration: 3000
});
return false;
}
// console.log(data);
that.globalData.userInfo['id'] = data.ID;
that.globalData.userInfo['NickName'] = data.NickName;
that.globalData.userInfo['HeadUrl'] = data.HeadUrl;
that.globalData.userInfo['class_sta'] = data.class;
var userId = data.ID;
if (!userId){
wx.showToast({
title: '登录失败!',
duration: 3000
});
return false;
}
that.d.userId = userId;
},
fail:function(e){
wx.showToast({
title: '网络异常!err:authlogin',
duration: 2000
});
},
});
},
可以发现就是跟第一代码一样。就是注释的是之前用的出问题的。
user.js 整个代码都拿过来了。需要解释的地方已经有注释了,仔细阅读便可。
var app = getApp()
Page( {
data: {
userInfo: {
},
orderInfo:{},
class_sta:'',
loadingText: '加载中...',
login:false,
loadingHidden: false,
},
//下拉刷新
onPullDownRefresh: function () {
wx.showNavigationBarLoading() //在标题栏中显示加载
//模拟加载
var that = this;
setTimeout(function () {
// complete
wx.hideNavigationBarLoading() //完成停止加载
wx.stopPullDownRefresh() //停止下拉刷新
}, 1500);
},
//生命周期函数--监听页面加载
onLoad: function (option) {
var that = this
//这里为了防止异步操作,先加载了APPgetuserInfo函数。因为首次使用该函数,返回的是没有处理过的数据,不是想要的。需要再次使用方可。
app.getUserInfo();
},
onLaunch:function(){
var that = this
},
call_phone:function(){
wx.makePhoneCall({
phoneNumber: '13213767383',
success:function(res){
}
})
},
logout:function(){
var that= this;
wx.showModal({
title: '确定退出吗?',
content: '',
success:function(res){
if(res.confirm){
//清除数据
that.setData({
userInfo: {},
login: false,
class_sta:''
})
//退出登录后,清除全局变量里的内容
app.getUserInfo();
}
}
})
},
login:function(){
var that = this;
//调用应用实例的方法获取全局数据(app.js)
// app.getUserInfo(function (userInfo) {
// //更新数
// that.setData({
// // class_sta: value,
// class_sta: userInfo.class_sta,
// userInfo: userInfo,
// login: true
// })
// console.log(app.globalData);
// });
console.log(app.globalData);
that.setData({
class_sta: app.globalData.userInfo.class_sta,
userInfo: app.globalData.userInfo,
login: true
})
},
onShareAppMessage: function () {
return {
title: '点餐小小',
path: '/pages/index/index',
success: function (res) {
// 分享成功
},
fail: function (res) {
// 分享失败
}
}
}
})
如果大家有其他更好的解法,欢迎留言呐