微信小程序 onLaunch onLoad onShow异步
程序员文章站
2022-07-03 09:33:02
...
小程序初始化时触发App里的onLaunch,后面再执行页面Page里的onLoad或onShow,但是在onLaunch里执行用户登录,等待返回值的时候Page里的onLoad或onShow事件就已经执行了。
原代码段
app.js代码片
.
globalData = {
userInfo: null,
token:''
}
onLaunch() {
this.$interceptors = {
request: {
config(p) {
p.url = 'http://test.xxx.com/api' + p.url
if(this.globalData.token && this.globalData.token != ''){
p.header = {
token: this.globalData.token
};
}
return p;
},
success(rst) {
return rst;
}
}
};
this.login();
}
login() {
const self = this;
wx.login({
success(data) {
wepy.request({
url: '/user/login?code='+data.code,
success: function(res) {
wx.setStorageSync('userInfo', res.data.obj);
self.globalData.token=res.data.obj.token ;
}
});
}
index.js代码片段
onShow(){
let self = this
wx.request({
url: '/message/get-count',
success: function(res) {
if (res.data.obj.count != 0) {
self.msgimg = '../img/msg.png';
self.msgshow = 'block';
self.msgnum = res.data.obj.count;
} else {
self.msgimg = '../img/nomsg.png';
self.msgshow = 'none';
}
self.$apply();
}
});
}
解决办法
这里采用的方法是在page页面定义一个回调函数,onLaunch请求完再执行回调函数。需要注意的是page页面判断一下当前 globalData.token 是否有值去然后再去请求业务接口。
App页面在请求success后判断时候有page页面定义的回调方法,如果有就执行该方法。因为回调函数是在Page里面定义的所以方法作用域this是指向Page页面。
定义了回调函数的 index.js 代码片
onShowCall(){
let self = this
wx.request({
url: '/message/get-count',
success: function(res) {
if (res.data.obj.count != 0) {
self.msgimg = '../img/msg.png';
self.msgshow = 'block';
self.msgnum = res.data.obj.count;
} else {
self.msgimg = '../img/nomsg.png';
self.msgshow = 'none';
}
self.$apply();
}
});
}
onShow(){
var token = this.$parent.globalData.token
console.log("token:"+token);
if( token == ''){
getApp().loginCallback = res => {
this.onShowCall()
};
}else{
this.onShowCall()
}
}
加了回调函数的 app.js 代码片段
globalData = {
userInfo: null,
token:''
}
onLaunch() {
this.$interceptors = {
request: {
config(p) {
p.url = 'http://test.xxx.com/api' + p.url
if(this.globalData.token && this.globalData.token != ''){
p.header = {
token: this.globalData.token
};
}
return p;
},
success(rst) {
return rst;
}
}
};
this.login();
}
login() {
const self = this;
wx.login({
success(data) {
wepy.request({
url: '/user/login?code='+data.code,
success: function(res) {
wx.setStorageSync('userInfo', res.data.obj);
self.globalData.token=res.data.obj.token ;
//这里调用回调函数
if (getApp().loginCallback) {
getApp().loginCallback(res.data.obj.token);
}
}
});
}
这样的话,就能实现想要的结果。执行顺序就是:
[App] onLaunch -> [Page] onLoad -> [App] onLaunch sucess callback
上一篇: 实现一个Promise
下一篇: 实现一个promise
推荐阅读
-
微信小程序异步API为Promise简化异步编程的操作方法
-
微信小程序利用co处理异步流程的方法教程
-
微信小程序中使用ECharts 异步加载数据的方法
-
微信小程序中使用Promise进行异步流程处理的实例详解
-
微信小程序之支付后调用SDK的异步通知及验证处理订单方法
-
微信小程序 es6-promise.js封装请求与处理异步进程
-
uni-app小程序 onLaunch与onload异步请求的解决
-
小程序开发——解决用户登陆时发生onLaunch与onLoad异步的问题
-
微信小程序app.js的onLaunch执行完之后再执行Page的onLoad & 小程序onLaunch和onLoad执行顺序
-
微信小程序 onLaunch onLoad onShow异步