在小程序中,登录需要通过按钮才能触发了,那么在登录完成前(授权登录后逻辑登录),是不应该触发涉及用户的逻辑代码的,比如说没登录的情况下,用户中心页面应该不触发请求的。
解决方案可以自己封装底部导航栏,没有登录即不显示其他页面;也可以在进入页面的时候先判断是登录,登录了再触发逻辑。
相比于第二种,第一种麻烦很多,所以这里介绍第二种,登录后在触发逻辑。
思路如下:
在app.js中实现两个方法,一个方法是授权登录获取用户信息authorize,一个方法是判断是否已经登录waitLogin。在第二个方法waitLogin中,定时判断是否已经登录,如果登录了就返回确定标志。
为什么要是定时判断呢,如果不是定时判断,只触发一次判断,远远没有实现登录后立马触发逻辑代码的功能。
代码如下:
const Request = require("/utils/request");
App({
onLaunch: function(options) {
this.authorize(options.query);
},
authorize: function(share) {
//登录并获取用户信息,最后保存到缓存和globalData中
},
globalData: {
sessionid: "",
userInfo: {},
userLevel:{}
},
/**
* 等待登录完成
*/
waitLogin: function() {
let promise = new Promise((resolve, reject) => {
let timer = setInterval(() => {
if (this.globalData.sessionid && this.globalData.userInfo.id && this.globalData.userLevel.id && this.globalData.isIOS !== undefined) {
clearInterval(timer);
resolve(this.globalData);
} else {
//todo 信息构建中
}
}, 250);
});
return promise;
}
})
可以看到waitLogin 方法的重点在于定时和promise,只有在判断已经登录后,才会触发resolve。
需要登录才能触发的逻辑,在页面加载完成时调用getApp().waitLogin().then(data=>{});并在回调中触发逻辑代码即可,如下:
