小程式非同步獲取openid解決方案
阿新 • • 發佈:2021-07-22
相信很多朋友在開發小程式的時候都會遇到小程式啟動後,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 }); } } }); }