微信/頭條小程序如何確保異步請求執行完后再執行各頁面的onLoad方法


微信/頭條小程序如何確保異步請求執行完后再執行各頁面的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();
      }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM