wx 小程序的全局异步数据你们是如何加载管理的?

2021-01-15 09:32:23 +08:00
 firhome
向各位开发过小程序的大佬们请教个问题。

我有一个小程序,需要初始化一些远程数据 放全局 ( 小程序的各个页面可能都会使用到 )

所以在 app onLaunch 的时候去请求~ 但是小程序页面并不会等 这个异步请求结束后再加载。所以会导致页面报错。

那么官方给的解决方案是 app 里写 callback 。 我有很多页面都会用到这部分数据 可又不可能 每个页面去写 callback 。



我自己想了两个解决方案。

1. 小程序 onLaunch 的时候去本地存储找是否有这部分数据,如果有 不请求(直接使用,页面不会报错),如果没有那请求之后 再重新调用 pages 的 onload 加载一次(类似网页刷新) 页面。

2.做一个空白( loading )页面当首页,等数据都加载好了 再跳 其它页面。

想问问大家是怎么解决呢?
3758 次点击
所在节点    程序员
35 条回复
preach
2021-01-15 13:46:03 +08:00
zhyl
2021-01-15 13:54:10 +08:00
第二种方案,然后在 app.onShow 中进行数据加载和页面跳转
MENGKE
2021-01-15 14:40:06 +08:00
可以用 defineProperty 吧,或者 ES6 的 proxy ;
https://blog.csdn.net/qq_17497931/article/details/108109947
nekochyan
2021-01-15 15:49:40 +08:00
我们的解决方案 第一步就像你说的那样 onLaunch 的时候去本地存储找是否有这部分数据,如果有不请求,直接使用
第二个是写一个通用的事件通知,没数据的话注册监听在 onLaunch 里面,然后数据返回的时候 trigger 一下事件所有监听的地方就刷新了
nekochyan
2021-01-15 16:00:12 +08:00
就是楼上说的发布订阅模式
lutian
2021-01-15 16:06:52 +08:00
aa
GzhiYi
2021-01-15 16:30:49 +08:00
响应式原理可解。
懒得写的话用 omix 。
https://github.com/Tencent/omi/tree/master/packages/omix
miloooz
2021-01-15 16:39:10 +08:00
我做了些封装
1. app.ts 检查 token 是否存在,存在则直接请求 token,不存在则先请求 token,再请求全局公共数据(这里的判断是放在 store 里的)
2. 封装 http 请求,没有 token 则拦截所有的请求,先把 token 请求到再把拦截的请求全部放行(这里的判断是放在 http 的封装里的)

有一种情况就是,页面内的请求依赖全局的内容时,这里涉及到顺序。页面我用了 computed 插件,watch 监听 store 里被依赖的数据。如果被依赖的数据为空,则不执行,等到 app.ts 里请求到了全局公共数据,触发 wetch,再请求。
SakuraKuma
2021-01-15 16:39:17 +08:00
patch 一下 Page, hook 一下 onload 加绑个事件, app 获取完数据 trigger/emit.
miloooz
2021-01-15 16:41:28 +08:00
全局的 store 和 computed 插件 这个官方的扩展里都有,引到项目里用就可以了
https://developers.weixin.qq.com/miniprogram/dev/extended/utils/computed.html
miloooz
2021-01-15 16:45:47 +08:00
啊 上面的写错了
1. app.ts 检查 token 是否存在,存在则直接请求全局公共数据,不存在则先请求 token,再请求全局公共数据(这里的判断是放在 store 里的)
yehuzi
2021-01-15 16:53:28 +08:00
发布 /订阅模式应该可以解决楼主的问题吧: https://aotu.io/notes/2017/01/19/wxapp-event/
looppppp
2021-01-15 20:31:03 +08:00
接管 Page 全局方法,代理一下 onLoad 这些生命周期方法,然后就可以接入 redux 了,爽歪歪
ersic
2021-01-15 20:38:43 +08:00
了解一下预加载跟周期性拉取得特性
cxe2v
2021-01-30 14:59:09 +08:00
我写的方案是,第一次 lanuch 的时候获取全局数据,存到 app.js 的一个自定义的全局变量里,以后页面上要用自己去 app.globalData 里去拿,当然小程序是有一个加载界面的,在 lanuch 的时候一直处于加载动画上,所以用户体验稍微好一点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/745107

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX