wx.request无法同步
发布于 5 年前 作者 ycai 2172 次浏览 来自 官方Issues

问题概述

小程序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 同步或异步

5 回复

在app.js的globalData里定义一个用来接获取通过promise的方式openid的变量,在index页面通过全局变量的resolve去请求其他接口,这种方式可以解决app.js获取数据不及时,导致首页获取数据出问题

楼主有没有解决这个问题,同没办法

这个和wx.request是同步还是异步没啥关系,你的需求是

『如何提前获取和保存token』

这个需求很常见,有很多解决方法。

从思路上有几种常用的解决方法

1. 在每次request的时候,判断是否有token,没有就先请求(相当于request的before钩子)

2. 在每次进入页面时,判断是否有token,没有就请求(相当于Router的before钩子)

你可以自己适合哪种就用哪种

当然,最友好也是最常用的肯定是第二种。但是第二种有个坏处是,小程序暂时还不能支持router的before钩子,你可以通过框架或者AOP去解决。一劳永逸,所以推荐用这种

试试自定义一个路由拦截器,所有页面都要经过路由,在路由里可以判断有没有token,有就放行,没有就登录后再放行

我上一个小程序是做了个welcome页面,在welcome页面去设token,放到 App 里

回到顶部