@
遇到問題
請求api返回需要先登入,實際上登入已成功
想必大家在開發小程式的時候,肯定遇到了頁面請求資料載入介面先執行,wx.login()登入介面後執行,導致請求介面返回請先登入,實際上登入確實成功的異常情況!
問題分析
在微信小程式中,由於app.js中的onLaunch和其他頁面中js的onLoad屬於非同步執行。
有時onLaunch中會有網路請求,在等待網路返回值時,也就是還未執行完時,其他頁面中js的onLoad已經執行了。這時就會導致頁面中的onLoad函式沒有獲取到登入成功後的token以及其他必備引數,從而導致請求介面時,因為缺失必備引數獲得的返回值異常的情況。
解決問題
自定義回撥函式
這裡我們在app.js中,自定義一個名為 loginCallback 回撥函式,然後再頁面的onLoad()函式中,監聽 loginCallback 函式的執行,繼續完成需要執行的操作即可。
app.js
App<IAppOption>({
onLaunch(options) {
let that = this;
wx.login({
success: res => {
api.login(res.code, scene).then(() => {
if (that.loginCallback){
that.loginCallback(1); // 執行自定義回撥函式
}
});
},
});
});
});
index.js
const app = getApp<IAppOption>()
Page({
onLoad() {
app.loginCallback = flag => { // 監聽自定義回撥函式執行
if(flag) {
api.post('/xxxxxxxxxxxxx').then((res) => { // post api
// do something
});
}
}
})
})
擴充套件提問
上述程式碼中,app.js裡 loginCallback 其實並未單獨定義,但是也能夠執行成功,是為什麼呢?