小程序开发——解决用户登陆时发生onLaunch与onLoad异步的问题
程序员文章站
2022-07-03 09:52:13
...
在app.js的onLaunch中执行登录部分的代码时,由于异步,index页面中的onLoad已经开始执行。而此时onLaunch还没运行完呐,index获取不到登陆信息。怎么办?
一种方式是通过回调函数,我刚开始也是用的这个方法,但是这个方法有一定的缺陷(如果启动页中有多个组件需要判断登陆情况,就会产生多个异步回调,过程冗余),不建议采用。
我这里采用另一个方法:通过Object.defineProperty监听globalData中的uid值来实现。具体方法如下:
//app.js
App({
globalData: {
uid: 0
},
onLaunch: function () {
const that=this;
//模拟登陆流程,3秒后获取到uid。
setTimeout(function () {
that.globalData.uid = 100866
}, 3000)
},
// 监听uid属性
watch: function (method) {
var obj = this.globalData;
Object.defineProperty(obj, "uid", {
configurable: true,
enumerable: true,
set: function (value) {
this._uid = value;
method(value);
},
get: function () {
return this._uid
}
})
}
})
//index.js
const app = getApp()
Page({
onLoad: function() {
console.log('登陆流程尚未完成,uid是:',app.globalData.uid)
app.watch(function(uid){
console.log("登陆流程已完成,新的uid是:",uid)
console.log('登陆流程已完成,新的app.globalData.uid是:', app.globalData.uid)
// 此处执行登陆后的业务
// function(){}
})
}
})