1. 程式人生 > 其它 >小程式非同步獲取openid解決方案

小程式非同步獲取openid解決方案

相信很多朋友在開發小程式的時候都會遇到小程式啟動後,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
          });
        }
      }
    });
  }