评论

优雅解决:关于app.js的onLaunch 与 页面的onLoad 的异步问题

onLaunch 与 onLoad 的异步问题,遇到很多人问过我。今天比较闲,写个文章分享交流。

// 常见的场景:打开小程序时要先获取用户数据,再调其他接口

    // 步骤:

    //    1、获取openid

    //    2、根据openid获取用户数据

    //    3、获取到用户数据后 再 调取其他接口


啥也别说,直接看代码吧:

实际开发会把很多步骤合并,我这展示就每一步详细说明


-------分割线--------------------- 以上为app.js页面------------


页面index.js(打开小程序页面栈的第一个页面)


总结:原理就是跨页面调用而已。该方法也可以使用在扫码进入的场景。只需在目标页面加上接收数据的函数init即可。


最后一次编辑于  2020-12-16  
点赞 8
收藏
评论

7 个评论

  • AA森林部落🙏
    AA森林部落🙏
    2021-09-06

    你这页面回退还要再刷新呢。所以还要写onshow。

    而init恰恰做了onshow的事。所以第1次进入 onshow时,大概率还没登录成功。

    而Nav几个页后,再回退到这个页,onshow就可以调用Init了。我用了另一种办法实现,就是在onshow里判断登录,不登录就等待30ms,

    2021-09-06
    赞同
    回复
  • 克制
    克制
    2021-06-22

    onLaunch  调用 getCurrentPages 拿不到 init


    2021-06-22
    赞同
    回复
  • Api调用师
    Api调用师
    2021-06-09

    超级无敌优雅的方案,专门解决这个问题的

    https://github.com/1977474741/vue-custom-hooks

    2021-06-09
    赞同
    回复 1
  • cat
    cat
    2021-05-27
    • 不要在 App.onLaunch 的时候调用 getCurrentPages(),此时 page 还没有生成。


    2021-05-27
    赞同
    回复 1
  • simple
    simple
    2021-02-07

    我有一个想法不知道可不可行:新增一个init 页面作为启动页,登录,判断角色配置主题色之类的都放在这里

    该页面UI: 正在加载配置项...

    异步请求完成后再跳转到其他页面。第二次打开可以获取缓存的数据不用进入init 页面

    2021-02-07
    赞同
    回复 2
  • 猛男陈阔
    猛男陈阔
    2020-12-16

    个人感觉不是一个很好的解决方案,每个页面有多个接口需要用户信息的话?init函数承载的压力太大了;代码可读性 粘合性太差了?不如在app.js中加一个callback?

    2020-12-16
    赞同
    回复 5
    • 袁述~
      袁述~
      2020-12-16
      这是解决启动时的异步问题。不需要每个页面添加ini函数。仅且执行一次。
      2020-12-16
      回复
    • 猛男陈阔
      猛男陈阔
      2020-12-16回复袁述~
      我的意思也亦如此
      举个例子:首页调用了10个接口 这些接口都先获取到用户的openId
      2020-12-16
      回复
    • 袁述~
      袁述~
      2020-12-16
      全部写在首页init函数即可。
      2020-12-16
      回复
    • 猛男陈阔
      猛男陈阔
      2020-12-16回复袁述~
      app.callback不会更优雅一些吗?
      2020-12-16
      回复
    • Api调用师
      Api调用师
      2021-06-09
      超级无敌优雅的方案,专门解决这个问题的
      https://github.com/1977474741/vue-custom-hooks
      2021-06-09
      回复
  • 姑苏洛言
    姑苏洛言
    2020-12-16

    好像callback

    2020-12-16
    赞同
    回复
登录 后发表内容