问题概述
小程序request请求是异步的特性,app.js onLaunch()
中的请求与index.js onLoad()
中的请求是同时进行的,导致onLoad()
中如有基于onLaunch()
返回的数据的请求,会有报错,这样会使onLoad()
中request请求的数据“第一次”无法正常获取。
我的小程序中所有的requset请求都需要在header中带着用户唯一的token进行发起,而token是在app.js onLaunch()
中的wx.login()返回中获取到的(由code到后台换取),之后通过wx.setStorageSync('token', res.data)
存到小程序中。 问题是index.js执行需要前面的返回结果时 前面的请求结果还没返回。
目前是每个页面加回调,要经过n次判断。这样对于开发真的很不友好。
希望官方可以 让开发者控制 wx.request 同步或异步
在app.js的globalData里定义一个用来接获取通过promise的方式openid的变量,在index页面通过全局变量的resolve去请求其他接口,这种方式可以解决app.js获取数据不及时,导致首页获取数据出问题
这个和wx.request是同步还是异步没啥关系,你的需求是
『如何提前获取和保存token』
这个需求很常见,有很多解决方法。
从思路上有几种常用的解决方法
1. 在每次request的时候,判断是否有token,没有就先请求(相当于request的before钩子)
2. 在每次进入页面时,判断是否有token,没有就请求(相当于Router的before钩子)
你可以自己适合哪种就用哪种
当然,最友好也是最常用的肯定是第二种。但是第二种有个坏处是,小程序暂时还不能支持router的before钩子,你可以通过框架或者AOP去解决。一劳永逸,所以推荐用这种
一般小程序框架都可以解决,可以试一下。
如果纯原生也行,我举个例子
// app.js
const _page = Page;
Page = (opt = {}) => {
const onLoad = opt.onLoad;
if
(!onLoad) {
opt.onLoad =
function
onLoads() {};
}
opt.onLoad =
function
onLoads(query) {
// 这里去处理token
onLoad.call(
this
, query);
};
_page(opt);
};
welcome这个话,估计会被产品干死... 不过如果是自己做就没关系
小程序app与page异步问题的最佳实践? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/00002ac57208f0e7335d111f156013
楼主有没有解决这个问题,同没办法
试试自定义一个路由拦截器,所有页面都要经过路由,在路由里可以判断有没有token,有就放行,没有就登录后再放行
我上一个小程序是做了个welcome页面,在welcome页面去设token,放到 App 里
我在welcome里整合了所有入口,比如,你从公众号要进一个商品的详情页面,
/pages/welcome?scene=1,1320
其中第一位 1 这个是我自己定义的静态变量,表示页面,是商品详情;后面的1320是页面的参数 id。在welcome拿到token后,再redirectTo到商品详情页面。
如果只是token的问题,那你可以封装下请求,token没回来的时候要把后续方法都放到一个队列里,token回来之后再依次执行。封装的时候记得留个标识,页面onUnload的时候可以清理下。
我主管猜测上,把request改成了同步,你在onLanch里调用,如果超时可能会影响小程序加载。不然为啥 setStorage 这都可以做同步,请求没理由不做呢。