一说到小程序,很多人都知道 微信小程序,但是如果你是小程序开发者,那么也可能知道百度小程序;
有一句开发者的至理名言,如果你在开发百度小程序中遇到了问题,那么第一时间不是取看文档,逛社区论坛,
因为你找不到相关的问题,最正确的做法是 在你的问题前面加上微信小程序,这样就能解决问题了;
上面是个笑话,我们知道小程序的开放接口中有一个登陆功能,使用很简单,就是一个请求,
微信的是 wx.login , 百度的是 swan.login() , 其实没什么区别,都一样,
只要你请求了这个接口,那么就能返回一个 code 值;
然后我们拿着这个获取到的 code ,再去请求 我们自己项目的服务器接口,在微信中就可以返回一个登陆的状态,
简单来说就是一个字符串,标识这个用户状态,然后我们还可以使用这个字符串作为参数去请求我们后台的
相关的数据; 在百度小程序中也是同样的原理;
我们假设获取到的用户标识是 usertoken 或者简单一点 uk ;
我们知道,小程序中动态的数据是要请求接口的,从服务器返回我们需要的请求,
那么我们需要把这个 usertoken 或者 uk 作为参数传递过去,这样,后台就会把数据返回给前端了;
这就是一般的小程序的开发的步骤;
但是,其中有个问题是,假设我们在小程序启动的时候,也就是 AppLaunch 的时候去获取 usertoken ;
这个使用code 换取 usertoken 的请求不能确定什么时候返回我们 usertoken ,
也就是说我们可能在 100ms 内可以拿到这个 usertoken ,也可能在 1000ms 后拿到usertoken ;
但是小程序执行完 AppLaunch 之后就会显示第一个页面,index.wxml ;
假设我们需要在 index.html 中显示请求来的数据,但是这个请求又需要usertoken 作为参数,
最要命的是这个时候 usertoken 还没有获取到,那就很尴尬了,肯定有人遇到过这样的情况吧;
我看到网上有人提出类似的问题,并且本人也遇到过这样的问题;
那么有什么解决办法呢?
第一种,放弃首页带 usertoken 参数的请求
分析:一般情况下,在进入首页之后,usertoken 都是可以获取进来了,所以说,如果首页需要usertoken
作为参数去请求接口,那么是不是可以放弃这个带usertoken 参数的请求,如果请求的参数和用户
没有直接关系,那么是不是可以放弃携带 usertoken 参数,直接请求接口数据;
上面的做法可以视为一种解决方案,但是问题也很明显, usertoken 万一返回的时间稍长,等用户
进入其它页面的时候还是没有获取到 usertoken 怎么办,这就是个问题了;
第二种,加loading,如果返回 usertoken 的时间不是巨长无比,那么我们在发起请求之前判断 usertoken
是否已经获取到,如果没有,那么在需要请求接口的数据进行渲染的部分加上一个微信默认的loading
是不是也是OK的呢?
第三种,这种方式也挺狠的,我们无法阻止 AppLaunch 的进行,但是却可以阻止首页的渲染,
在首页展示页面之前判断 usertoken 是否已经获取到,如果没有,那么首页加上一个进度条,加载条都行,
获取成功之后再显示页面,然后保存 usertoken 到全局或者storage都行;
第四种,上面的方法都是存在问题的,第四种算是一个补充吧,当用户通过分享进入小程序,也就是说用户可以跳过
首页,直接进入到某一个确定的页面中,那么这个页面也是需要对 usertoken 进行判断和处理的,
但是,无论从什么地方进入,都会触发 AppLaunch 的这个函数,但是AppLaunch 这个函数不能阻止其执行,
也就是说,如果可以阻止执行,我们就能够在获取到 usertoken 之后再显示页面,无论是正常进入还是通过
分享的入口进入; 还有一点需要我们注意下,如果多次请求usertoken 一定要使用最新的 usertoken ;否则
会因为使用上一次产生的 code 和 usertoken 出现一定的问题;
上面简单的描述了登陆应用中的一点问题,有点乱,仅作参数;