小程序异步获取openid解决方案

2018-08-21  本文已影响1039人  ChasenGao

相信很多朋友在开发小程序的时候都会遇到小程序启动后,index页面加载成功之后才获取到openid,导致一些index页面的post请求无法正常通讯,我这几天也在想这个问题,并使用了一些解决方案:
第一种方案:引导页 + promise (方案来源于网络)
1、app.js中通过promise封装一个异步获取openid的方法。
2、新建load引导页,并在app.json中设置该页面指定。
3、load.js 的onload钩子中,设置promise成功时,页面重定向到index。
4、这样便实现了先获取openid 再携带openid跳转。

这篇文章在CSDN上被无限转载,用过的朋友都说解决方案很不错,但我发现了弊端。
如果没有自己做tabbar组件而使用官方tabbar组件的话,load页就不能指定,否则页面会无法加载。
对于刚接触小程序开发的朋友来说,如果没有vue之类的基础,写一个component未免稍微复杂了一些。

于是在经过几次尝试之后,我找到了第二种自认为比较不错的结局方案。
第二种方案:promise + if判断
1、app.js中的promise不变。
2、因为index页面加载后,会向服务器发送请求来获取数据,所以我们把这些请求全都放到一个自定义函数中,比如fn()
3、index.js的onload中,做一个判断,如果localstorage中有openid,则执行this.fn() ,如果没有,就执行promise后,再执行fn()

相关代码:
app.js

 getToken() {
    return new Promise((resolve, reject) => {
      // 登录
      wx.login({
        success: res => {
          // 发送 res.code 到后台换取 openId, sessionKey, unionId
          if (res.code) {
            //发送res.code 到后台
            wx.request({
              url: this.globalApi.checkUser,
              method: 'POST',
              data: {
                code: res.code
              },
              success(res) {
                //成功返回数据后,将token值存储到localStorage中
                wx.setStorage({
                  key: 'yerlLocalToken',
                  data: res.data.token
                });
                wx.setStorage({
                  key: 'yerlUserOpenid',
                  data: res.data.openid,
                })
                var resArg = res.data.token;
                resolve(resArg)
              },
              fail() {
                reject();
              }
            })
          }
        }
      })
    })
  }

index.js

onLoad() {
    var that = this;
    if (!wx.getStorageSync('yerlLocalToken') || wx.getStorageSync('yerlUserOpenid')){
      app.getToken().then((resArg) => {
        that.indexPage();
      })
    }else{
      that.indexPage();
    }
    //获取banner图片
  },indexPage(){
    var that = this;
    wx.request({
      url: app.globalApi.getIndexBanners,
      method: 'POST',
      data: {
        token: wx.getStorageSync('yerlLocalToken'),
        openid: wx.getStorageSync('yerlUserOpenid')
      },
      success(res) {
        //任何情况下,只要返回的数据不包含content字段,则显示默认占位图片
        if (!res.data.content || res.data.status == 'error') {
          that.setData({
            bnrUrls: ['https://lg-rqwhkn0q-1255357964.cos.ap-shanghai.myqcloud.com/indexBannerError.jpg']
          })
        } else {
          //将返回的图片列表赋值给bnrUrls
          that.setData({
            bnrUrls: res.data.content
          })
        };
        //如果返回值中包含token,就重设token
        if (res.data.token) {
          wx.setStorage({
            key: 'yerlLocalToken',
            data: res.data.token
          });
        }
      }
    });
  }

到目前尚未发现问题,后续如果出现bug会再解决并更新文章。

上一篇下一篇

猜你喜欢

热点阅读