微信/頭條小程序如何確保異步請求執行完后再執行各頁面的onLoad方法
在開發的過程中,由於小程序生命周期的執行順序是不可暫停的,以登錄權限為例:
當進入小程序時首先執行app.js的onLaunch--onShow方式后再執行b頁面的onLoad方法,b頁面需要彈出提示登錄的彈窗,當服務器返回需要一定時間或網絡較差時,此時小程序已經執行了b頁面的方法,導致在登錄接口還沒有返回前就已經在b頁面判斷了權限。
app.js
onLaunch() {
loginByCode().then(resolve => {
//do something
});
}
loginByCode() {
return new Promise(resolve => {
wx.request({
url: 'https://xxx.com',
method: 'GET',
data: {},
success: ({
data,
statusCode,
header
}) => {
//接口返回結果后將登錄狀態置為true
app.globalData.loginPermissions = true;
resolve();
}
})
});
}
這里我們在小程序冷啟動時onLaunch中做了個簡單的異步請求。
頁面b.js
onLoad() {
//當進入此頁面時,需要判斷是否已登錄用戶,如果沒有登錄需要彈出登錄彈窗
if(!app.globalData.loginPermissions) {
this.loginPopup.open();
}else {
//do something
}
}
假如按照以上方式處理,會導致loginByCode登錄接口返回緩慢時,進入b頁面后,即使用戶已經是登錄的狀態,但依然會彈出登錄窗口。
對於上述問題,我們來改進一下代碼
app.js
onLaunch() {
loginByCode().then(resolve => {
if (this.loginCallBack) {
//這里的this 是指當前頁面的this
this.loginCallBack();
}
});
}
loginByCode() {
return new Promise(resolve => {
wx.request({
url: 'https://xxx.com',
method: 'GET',
data: {},
success: ({
data,
statusCode,
header
}) => {
//接口返回結果后將登錄狀態置為true
app.globalData.loginPermissions = true;
resolve();
}
})
});
}
頁面b.js
onLoad() {
//當進入此頁面時,需要判斷是否已登錄用戶,如果沒有登錄需要彈出登錄彈窗
if(app.globalData.loginPermissions && app.globalData.loginPermissions != '') {
//do something
}else {
app.loginCallBack = () => {
if (!app.globalData.loginPermissions) this.loginPopup.open();
else this.loginPopup.close();
}
}
}