如何解决app.js与pages并行问题?
发布于 6 年前 作者 chao59 11994 次浏览 来自 问答

如何解决app.js与pages异步并行问题?

我想一打开程序就在app.js获取用户信息,然后再执行pages组件的onLoad
网上别人都说是在pages onLoad里判断,但是这也只能解决单个pages组件,我想要全部有拦截怎么处理?总不能一个一个写判断吧!

情况:
1、app.js执行获取登录态,然后再获取用户信息。
2、个别page组件会需要重新获取用户信息,比如:个人中心、购物车等....

我现在遇到的问题:
如果用户第一次打开的是个人中心,个人中心我会重新请求用户信息,然后没有登录态再重新请求登录态,可是app.js也同时获取登录态和用户信息
,它们两是并行的,然后都重新获取登录态,就造成了请求两次登录态,简单的程序不会有什么影响,但是程序复杂就有很难控制

请问能不能有什么办法可以在app.js控制pages所有组件的加载问题呢?
7 回复

在app.js 里面 获取openid,然后请求后端接口,后端根据openid 去判断用户信息,并返回状态。根据返回的状态前端判断处理,是否有用户信息。如果没有用户信息,弹出获取用户信息的按钮,将获取的用户信息和openid 存储。以后页面请求接口。在header里面带着openid就行,剩下就是后端处理逻辑问题了

情况:

1、app.js执行获取登录态,然后再获取用户信息。

2、个别page组件会需要重新获取用户信息,比如:个人中心、购物车等…

我现在遇到的问题:

如果用户第一次打开的是个人中心,个人中心我会重新请求用户信息,然后没有登录态再重新请求登录态,可是app.js也同时获取登录态和用户信息,它们两是并行的,然后都重新获取登录态,就造成了请求两次登录态,简单的程序不会有什么影响,但是程序复杂就有问题了

这是两个异步行为,无法确保谁在前谁在后。我提供一个思路:

app.js 正常获取用户信息,拿到用户信息放到内存里。

page.onLoad 从内存里取用户信息,能取到就用,取不到就在重新获取一次

这是个好问题,已站好姿势,等待大佬入场

//app.js
App({
  onLaunch: function() {
    // 登录
    wx.login({
      success: res => {
        var app = this;
        if (res.code) {
          wx.request({
            url: url,
            method: 'POST',
            data: {
              code: res.code
            },
            success: function(res) {
              app.globalData.userkey = res.data.userkey; //登录后保存 userkey
              if (app.login) { //是否有保存的事件,有就执行
                app.login()
              }
            }
          })
        }
      }
    })
  },
  isLogin: function(e) {
    var app = this;
    if (app.globalData.userkey) { // 是否已经登录
      if (e) {
        e()  // 已登录 直接执行事件
      }
    } else { // 没有登录 保存 传过来的事件
      app.login = e
    }
  }
})

 //页面js
  onLoad: function(options) {
    agetApp().isLogin(function() {
      //事件
    })
  },

拦截处理?那应该在封装一下请求。如果获取用户信息失败就return?

回到顶部