战狼
战狼
  • 发布:2019-06-20 14:00
  • 更新:2023-10-23 17:20
  • 阅读:4431

应用生命周期onShow是否可以等待异步请求执行完毕后,在结束该方法呢?

分类:uni-app

我发现一个问题是这样的

应用生命周期App.vue onShow
页面生命周期home.vue onShow

我在App.vue onShow中执行刷新token操作,但是由于uni.request是异步的,这样就导致一个问题,刷新token操作可能并没有执行完成,就进入home.vue的onShow方法中了,在home.vue onShow方法中,有一些request请求,由于token并没有刷新完成,就会照成home.vue request请求会失败! App.onShow 方法内容如下:
onShow: function() {
console.log('App Show');
let that = this;
let applogon = new AppLogin();
// 获取登录信息 每次app展示到前台时,重新获取访问token
applogon.refreshAccessToken()
.then(function(){
console.log('获取用户信息');
applogon.getUserInfo();
}, function(){
console.log('不能获取登录信息需要登录')
that.goLogin();
}).finally(function(){
done = true;
console.log('获取用户完成')
});
}

请问: 没有办法保证App.onShow 方法里面包括异步的uni.request 都执行完成后,才进入home.vue 的onShow方法呢?

2019-06-20 14:00 负责人:无 分享
已邀请:
回梦無痕

回梦無痕 - 暂停服务

没有办法保证App.onShow 方法里面包括异步的uni.request 都执行完成后,才进入home.vue 的onShow方法呢?
回答是:不能。

你可以把你的home.vue 的onShow里面的逻辑代码放到别人地方,然后App.onShow异步请求回调中再通知home.vue执行你要执行的逻辑代码。

  • uniapp棒棒的

    请问要如何实现呢?如果要直接打开其它页面,是不是每个页面都要通知一下?

    2019-11-24 20:20

战狼

战狼 (作者)

感谢,确实只能采用这种办法了! 不过感觉有点别扭!

如果uni.request 支持同步就好了!!

霍霍

霍霍

我现在也有这种需求,跟你一模一样,不过我是想在全局onShow混入里刷新token,但是请求没执行完后续页面的onshow就执行了,请问你是怎么解决的

  • gadfly3173

    生命周期钩子本身就是异步的,不能指望生命周期钩子去阻塞渲染。可以每个页面执行前都调用一次登录,或者有登录页的话,统一处理uni.request,没有token的时候就返回到登录页

    2022-01-12 11:07

1***@163.com

1***@163.com

在APP.vue中执行刷新token操作,可以在全局设置一个变量来存储这个过程,在刷新token的过程中吧这个标志放置为true,然后再页面的onShow生命周期内,封装一个公用的promise方法轮询刷新token结束,等待promise成功则可以进行页面级别的接口请求,这样每个页面只需要一个公用方法,所有页面的接口请求写到这个方法后边就可以了。

要回复问题请先登录注册