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

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

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

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

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



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

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

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

想问问大家是怎么解决呢?
3739 次点击
所在节点    程序员
35 条回复
undertonememorie
2021-01-15 09:35:58 +08:00
在代码不做大改动情况下推荐第二种
sjhhjx0122
2021-01-15 09:37:20 +08:00
如果没有那请求之后 再重新调用 pages 的 onload 加载一次(类似网页刷新) 页面。
为什么不直接调用那个请求?
firhome
2021-01-15 09:40:12 +08:00
@sjhhjx0122 我描述错误,没加载的话 是要再请求一下接口 然后再重新 onload
totoro52
2021-01-15 09:42:06 +08:00
onLaunch 不建议做网络请求
firhome
2021-01-15 09:42:47 +08:00
@totoro52 为什么呢,那这种该写到哪里呢
hereIsChen
2021-01-15 09:46:56 +08:00
我们用的第二种方法,给了个加载页
hereIsChen
2021-01-15 09:47:16 +08:00
类似 app 的启动页面
hiro0729
2021-01-15 09:48:03 +08:00
写个通用的方法,里面先判断是否 globalData 里有没有数据,有直接 resolve,没有异步取得后 resolve,各个页面的 onShow:async ()=>{}或 onLoad:async ()=>{}里,都先 await 调用一下这个方法
varzy
2021-01-15 09:56:01 +08:00
我使用的方法类似于 8 楼,只不过是用了回调的语法。简单给个 demo 吧,写得不好勿喷。

<script async src="//jsfiddle.net/varzy/nk2071se/1/embed/js/"></script>
sujin190
2021-01-15 09:58:28 +08:00
或者在全局重新定义一下 Page,这样就是可以直接替换掉每个页面的 onLoad 方法,加入等待 onLaunch 加载完的流程就好了
varzy
2021-01-15 09:58:30 +08:00
@varzy #9 不知道怎么插入 jsfiddle 的预览。。。放个链接吧: https://jsfiddle.net/varzy/nk2071se/1/
sjhhjx0122
2021-01-15 10:02:59 +08:00
@firhome 那就最简单方式,封装一下请求,在发送请求之前判断一下 globalData 里有没有数据,没有数据就先发全局数据的那个请求,拿到数据在请求当前请求
firhome
2021-01-15 10:04:41 +08:00
@sujin190 我正在尝试这个方法,但发现 onLoad 会不停的重新加载,有 demo 可以学习下吗?
tjxone
2021-01-15 10:08:49 +08:00
将获取去全局数据的方法挂载再 app.js 上,该方法用 promise 封装好,作好缓存判断
后面每个页面的请求都先调用这个方法再请求各自页面的数据就可以了

app.js
getGlobalData(){return new Promise((resolve,reject)=>{ 先判断有无全局数据,无就请求数据再 resolve })}

其他各个页面
getApp().getGlobalData.then(自己的业务)
sam014
2021-01-15 10:10:29 +08:00
第二项感觉不错,顺便还能加个开屏广告,2333333333333

小程序用的 taro+mobx,全局数据放 mobx + run 调用 ,感觉比原生语法方便多了
totoro52
2021-01-15 10:24:11 +08:00
@firhome 因为你在这里做网络请求,如果你从服务器拉取一些特定的全局属性,还没拉取完就加载下个方法了 因为它是异步的,如果下面的方法用到这些属性就炸了 ,如果你非要在这做请求,你的第二个方案是可以的
tjxone
2021-01-15 10:26:56 +08:00
@sam014 第二项的话,如果分享页面就无法跳过去了
sam014
2021-01-15 10:36:29 +08:00
@tjxone 没有完美的方案,有舍有得,所以我选 taro+mobx
cczeng
2021-01-15 10:41:04 +08:00
弱弱的问一下,发布订阅模式不适用吗
phpcxy
2021-01-15 13:11:49 +08:00
第二个方案没考虑非首页进入的情况啊?

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

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

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

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

© 2021 V2EX