收藏
回答

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

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

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

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

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

请问能不能有什么办法可以在app.js控制pages所有组件的加载问题呢?
最后一次编辑于  2020-01-07
回答关注问题邀请回答
收藏

8 个回答

  • 建
    2020-01-07
    //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() {
          //事件
        })
      },
    


    2020-01-07
    有用 2
    回复 5
    • 2020-01-07
      可不可以做到页面.js全局配置呢,不想一个一个页面判断
      2020-01-07
      回复
    • 建
      2020-01-07回复
      不行,因为我这是把onLoad里的事件延后执行了,想要延后就要写在 agetApp().isLogin(function() { }) 里面,而且生命周期事件不能中断
      2020-01-07
      回复
    • 2020-01-07
      那能不能在app.js控制pages组件的加载呢
      2020-01-07
      回复
    • 建
      2020-01-07回复
      不能控制
      2020-01-07
      回复
    • 2020-01-07
      好吧,谢谢你
      2020-01-07
      回复
  • จุ๊บ
    จุ๊บ
    2020-01-07

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

    2020-01-07
    有用 1
    回复 4
    • 2020-01-07
      这也不能解决app.js与pages的问题啊
      2020-01-07
      回复
    • จุ๊บ
      จุ๊บ
      2020-01-07回复
      你的需求不就是,进入小程序判断用户是否授权嘛?没有授权就弹出授权页,如果授权就正常进入。
      2020-01-07
      回复
    • 2020-01-07
      你理解错啦
      2020-01-07
      回复
    • 2020-01-07
      情况:


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


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


      我现在遇到的问题:


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

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

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


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

    2020-01-07
    有用 1
    回复 1
    • 2020-01-07
      是的,我就是这样做,可执行page.onLoad 的时候app.js获取用户信息还没返回
      2020-01-07
      回复
  • 小肥羊🍊
    小肥羊🍊
    2020-01-07

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

    2020-01-07
    有用 1
    回复
  • 冷冷
    冷冷
    2020-03-25

    楼主有什么好的方法吗

    2020-03-25
    有用
    回复
  • 老张
    老张
    2020-01-07

    https://developers.weixin.qq.com/community/develop/article/doc/000a0aed14c3285bea79e67ee56813

    参考一下。

    2020-01-07
    有用
    回复 3
    • 2020-01-07
      谢谢你,但我现在的问题不是获取open呢
      2020-01-07
      回复
    • 老张
      老张
      2020-01-07回复
      知道。不管你想获取什么,提供一个思路:1、在任何地方都调用同一个同步函数;2、取信息同样按照这个顺序:globalData-storage-cloud-your server;
      2020-01-07
      回复
    • 2020-01-07
      我试一下,谢谢你😝
      2020-01-07
      回复
  • 2020-01-07

    情况:

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

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

    我现在遇到的问题:

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

    2020-01-07
    有用
    回复
  • 小满
    小满
    2020-01-07

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

    2020-01-07
    有用
    回复 1
    • 2020-01-07
      可以在page组件里拦截,可是这也只能局部处理,做不到全局pages组件处理
      2020-01-07
      回复
登录 后发表内容
问题标签